2010-04-17 34 views
2

摘要:我喜欢他们的方式设计/建筑,但我怎么实现这个

我主页上的不同组件和各种成分显示了一些推广给用户。

我有购物车作为一个组件,并根据购物车促销内容显示。 我必须跟踪用户在线活动并将该信息发送给Omniture以生成报告。

现在我的组件被异步加载,基本上在AjaxRequest被启动时加载,所以没有修复模式,或者更确切地说,组件将出现在网页上的信息。现在为了将信息传递给Omniture,我需要调用$(document).(ready)上的跟踪功能并为每个组件添加信息(每个组件需要Omniture需要7个参数)。

所以在每个组件的init:config功能正在呼叫的Omniture和传球paramters但现在no. of Omniture calls is directly proportional to no. of Components on the webpage但每次调用的Omniture是非常昂贵这是不能接受的。

现在我正在寻找一种方法,在该方法中,我可以将有关7个参数的信息分发给Omniture,并在其中传递这些信息。

需要注意的是,我不知道什么时候组件被加载,所以没有预先定义的时间或没有。将被加载的组件。

的事情是我打电话跟踪功能,当文件已准备就绪,但组件调用的Omniture已经取得所以我的问题是

Q后装:我怎么能收集到的信息对所有组件和而不是仅仅致电Omniture发送这些信息?

如前所述,我不知道何时装载组件,因为它们是在Ajax请求上完成的。

希望我能解释我的挑战,并希望如果有一个人能够从设计/建筑师提供了挑战解决方案。

+0

这个问题清楚了吗? – Rachel 2010-04-17 00:39:57

+0

我这么认为。我还没有答案;仍然在想它。记住,如果我编辑您的文章,包括几个网站分析标签? – doug 2010-04-17 02:26:33

+0

否。请更新我的问题以添加Web Analytics标记。 – Rachel 2010-04-17 03:22:05

回答

2

不要直接进入Omniture;去找一个获取数据的“中间人”。

我从来没有听说过Omniture,但它听起来像你的用户界面直接进入数据层的senarios - 在这种情况下,你需要一个业务逻辑层。无论如何,这就是原则。

  1. 创建一个处理UI和Omniture之间所有通信的逻辑层。
  2. 第一次UI调用命中逻辑层/控制器,例如:Logic.GetPromotion()
  3. 当这种情况发生时,逻辑调用omniture - 让它执行一次批量调用以获取所有数据,就像您descibed。
  4. 将请求的数据(Logic.GetPromotion())传递给任何叫它的人。
  5. 当另一个调用逻辑层的热时,它会从刚刚收到的信息中提取数据 - 而不是从全部收集。

基本上它是Lazy-Load模式;与各种各样的问题分开 - 我不知道我是否将它称为MVC - 只是结构合理(?)。

这种方法存在的一个潜在问题是,您的呼叫是异步的 - 逻辑控制器可能会在第二次呼叫仍在等待结果从第一个回来时进行。我自己并没有沿着这些线做任何事情,但有很多多线程/并发类型design patterns那里会有帮助。

+0

这不会解决我的目的。 – Rachel 2010-04-19 14:19:21

+0

尝试使用Http Proxy来查看在UI和Omniture之间来回发送的请求;这可能会给你一些见解,你需要做什么。如果Omniture负责制作所有昂贵通话的用户界面组件,那么我认为你可以做的事情不多。 – 2010-04-19 20:56:22

0

我假设所有组件在页面加载时都会进行AJAX调用并异步加载。

考虑有N个被加载的组件。因此,将有N个对服务器进行的AJAX调用。

在当前的实现中,在成功加载每个组件时,调用Omniture。

大多数浏览器允许大约最多2-5个到服务器的活动连接。因此,上述N个呼叫将一次在2-5个并发呼叫中执行,并且不会保证此呼叫完成时的订单。

我们需要有一个机制来拦截AJAX调用来加载组件,所以我们可以维护正在进行的这些调用的列表以及已完成调用的列表。

一旦正在进行的调用清单的计数为零,所有组件都已加载,并且我们已经完成的AJAX调用列表中的每个已加载组件的信息。

使用每个加载组件的信息列表,如果它需要API,则对Omniture进行一次调用。如果Omniture没有批量调用API,请在服务器上调用中间门面,这将反复调用Omniture。

Have an API that will be used by components to make AJAX calls 
Each time AJAX request is made for a component to load [new Ajax.Request(...)], 
    API adds component request info entry to requestInProgressList 
Each time AJAX request is for a component is complete (function onComplete(...) callback), 
    API moves component request info entry from requestInProgressList to requestCompleteList 
    IF requestInProgressList.count == 0 // No more pending requests 
    THEN 
     From requestCompleteList, collect the information for all the components into variable dataOmniture 
     Clear requestCompleteList 
     Make a call to Omniture to send dataOmniture information 
    END 
+0

这是否编译? – 2010-04-21 19:59:42

+0

你能更清楚地解释你的算法吗? – Rachel 2010-04-21 20:42:49

+0

@JC:这是一个算法,它不会编译。你需要在JavaScript中实现它才能运行。 – 2010-04-22 16:03:29

相关问题