仅当一系列XHR(IO)请求成功时,在YUI3中调用函数的最佳方法是什么?

时间:2009-12-06 07:48:44

标签: javascript ajax yui yui3

我想这个问题不仅仅针对YUI,而是我正在使用的JS库,具体的答案会有所帮助。

基本上在加载页面时,我想要一个脚本使用Y.io运行一些XHR,如果它们都成功返回数据,那么我希望脚本继续下一步,这将操纵收到的数据

我可以想到一些这样做的方法,但它们对我来说都显得有些笨拙,我希望有人有更好的建议。到目前为止我的想法:

  1. 将我想要的所有数据整合到一个JSON响应中,因此如果一个请求是好的,请继续。 (这是我最不喜欢的解决方案。)
  2. 当第一个Y.io请求返回成功时,调用next,依此类推,当最后一个成功时,我知道一切都成功了,然后继续执行脚本的下一步。
  3. 那里有更好的想法吗?我此刻并不喜欢我的任何一个,但我倾向于选择二。

2 个答案:

答案 0 :(得分:2)

您不需要对Y.io调用进行排队。只需将它们全部发送出去,当它们全部返回时,继续前进。

var data = {};

function step(id, o, part) {
    try {
        data[part] = Y.Lang.JSON.parse(o.responseText);

        if (data.a && data.b && data.c) {
            processData(data);
        }
    }
    catch (e) {
        /* handle bad JSON, failure case */
    }
}

Y.io(a_url, { on: { success: step }, 'arguments': 'a' });
Y.io(b_url, { on: { success: step }, 'arguments': 'b' });
Y.io(c_url, { on: { success: step }, 'arguments': 'c' });

答案 1 :(得分:1)

两种实现都有其优点:

  1. 此方法减少了减少传输开销的事务量
  2. 此方法可能会减少通过网络传输的数据总量,并通过允许客户端在其他请求进入队列时更快地开始工作来减少UI延迟时间。
  3. JavaScript适用于这些方法中的任何一种。第一个是直接的,第二个可以通过链接回调来完成。

    如果您需要/可以尽早开始处理数据,则第二种方法更可取。如果在处理之前需要所有数据,则需要第一种方法。这完全取决于你的情况。一般来说,如果你可以摆动它,第二种方法(多部分而不是一个大的反应)是可取的。