2011-09-29 62 views
3

我一直在研究jQuery的推迟对象一段时间了,而我一直在困扰着一件事。jquery:当您将延迟对象传入“then”时会发生什么?

“完成”,“总是”,“然后”等等方法将延迟对象解析时应该调用的函数作为它们的参数。

但是我试图通过传递延迟对象进入“永远”的方法链接请求,而且这似乎工作过:

// A is an array of data 
var req = ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure); 
for (var i = 1 ; i < A.length ; i++) { 
    var tmp = ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure); 
    req.always(tmp); 
    req = tmp; 
} 

但是,它并没有真正发挥作用。因为当我按照上面的代码如下:

req.always(foobar); 

foobar的似乎得到所谓的一些随机时间,之后不一定数组中的最后一个元素进行处理。

使用时会更好吗?

// A is an array of data 
var req = $.when(ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure)); 
for (var i = 1 ; i < A.length ; i++) { 
    req = $.when(req, ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure)); 
} 
req.always(foobar); 

会上面的代码(用“时”)结果在AJAX请求发生一前一后,还是会它们同时发生?

顺便说一句,我用“管道”来看链接,但由于范围问题,我认为使用“管道”与上面的for循环会更困难。

此外,为什么原始代码“几乎工作”?那里发生了什么?它是否像执行函数一样执行延迟对象,当它执行时会发生什么?

+0

PS:我尝试使用$。当它似乎工作。然而,我仍然不明白为什么要这样做“有点”的工作。这似乎是创建请求链比使用管道更好的方式 - 但我不确定这是如何“何时”打算使用。 – eeeeaaii

+0

当ajax调用的结果用于构建另一个Ajax调用的输入时,.pipe()很有用。在你的情况下,它看起来像并行ajax调用,使用$ .when()合并,更加适当。在我的回答中,我向您展示了如何在合并的延迟 – olivieradam666

+0

p.p.s.上使用.done()注册单个成功回调函数。使用$ .wait实际上并不奏效。但下面的“管道”的解决方案似乎工作,但我必须解决与“我”的范围界定问题 – eeeeaaii

回答

2

你应该建立一个数组,并使用javascript apply

//create an array of one deferred per element 
var requests = $.map(A, function(index, a){return= $.ajax(url + "?d=" + a);}); 
//merge all deferreds into a single one 
var mergedRequest = $.when.apply(null, requests); 

mergedRequest.done(function(res0, res1, ...){ 
    //your code goes here 
    //if you want results as an array just use arguments 
    arguments.length == A.length; 
}); 

编辑: 如果您想进行通话连续做:

var result = $.ajax(url + "?d=" + A[0]); 
for (var i = 1 ; i < A.length ; i++) { 
    result = result.pipe(function() { 
    return $.ajax(url + "?d=" + a[i]); 
    } 
} 
result.done(processResults).fail(reportFailure); 
+0

事情是,我不希望他们并行。我希望他们序列化。 – eeeeaaii

+0

第二件事情似乎工作 - 谢谢 - 虽然我认为可能有变量“我”的范围问题 - 但这是可以解决的。 – eeeeaaii

相关问题