繁体   English   中英

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

[英]What's the best way to call a function in YUI3 only if a series o XHR (IO) requests are successful?

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

基本上,在加载页面时,我希望脚本使用Y.io运行一些XHR,如果它们都成功返回了数据,则希望脚本继续进行下一步,它将处理接收到的数据。

我可以想到几种方法,但对我来说它们似乎都有些笨拙,我希望有人提出更好的建议。 到目前为止,我的想法是:

  1. 将我想要的所有数据合并到一个JSON响应中,因此如果一个请求很好,请继续。 (这是我最不喜欢的解决方案)。
  2. 当第一个Y.io请求成功返回时,调用下一个,依此类推,等等,当最后一个成功时,我知道一切都成功了,并继续执行脚本的下一步。

还有更好的主意吗? 目前,我并不真正喜欢我的任何一个,但我倾向于第二种选择。

您无需将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. 这种方法减少了交易量,从而减少了运输费用
  2. 通过允许客户端在其他请求排队时更早地开始工作,此方法可能会减少通过有线传输的数据总量并减少UI滞后时间。

JavaScript适用于这两种方法。 第一个很简单,第二个可以通过链接回调来完成。

如果您需要/可以早于以后开始处理数据,则最好使用第二种方法。 如果在处理之前需要所有数据,则需要第一种方法。 这真的取决于您的情况。 通常,如果可以摆动它,则最好使用第二种方法(多部分,而不是一个较大的响应)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM