使用$ .when.apply的简单替代方法并行链接jQuery

时间:2015-05-08 19:07:25

标签: javascript jquery promise jquery-deferred

当顺序使用jQuery promises时,可以反复使用df1$Sex<-ifelse(df1$Sex==0,'Male','Female') 链接它们:

e.g。

then

也可以在循环中工作(非常方便)。

我有类似的情况,我需要知道多个并行操作何时完成,但是没有通过创建一个承诺数组的编码开销(例如增加的复杂性),仅用于调用promise = promise.then(someoperation());

在查看我的选项之后,我想出了这种模式作为替代方案:

$.when.apply

为了测试它,我想出了这个测试:

promise = $.when(promise, anotherpromise);

JSFiddle: http://jsfiddle.net/TrueBlueAussie/0rh8Lhv4/1/

这似乎工作正常,所以我开始将它应用于StackOverflow上的其他示例。

我尝试使用此模式的下一个是修复Pass in an array of Deferreds to $.when()中的示例:

我的代码:

var p = $.Deferred().resolve().promise();

[1,2,3,4,5,6,7,8,9,10].forEach(function(i){
     p = $.when(p, delay(i,i * 500));
});

p.then(function(){
   log("All done");
});

JSFiddle: http://jsfiddle.net/TrueBlueAussie/ts1dqwe3/1/

问。由于某种原因,这个从未发生过最后的事件。有人能发现问题吗?

更新

根据$("a").click(function () { var promise = GetSomeDeferredStuff(); promise.then(function () { $("div").append("<p>All done!</p>"); }); }); 的评论,似乎初始的@Karl-André Gagnon可能只是未定义且仍然有效。更简单:

e.g。

promise

2 个答案:

答案 0 :(得分:2)

好的,事实证明这种模式确实很好用,但你需要确保链接到的初始function GetSomeDeferredStuff() { var promise = $.Deferred().resolve().promise(); 已经解决:

$.when.apply

JSFiddle: http://jsfiddle.ne/TrueBlueAussie/ts1dqwe3/2/

总之,这种模式确实 是创建仅供function GetSomeDeferredStuff() { var promise; 使用的数组的简单替代方法。

另外,正如@ Karl-AndréGagnon指出的那样,如果你从一个未定义的值开始,它也会做同样的事情。更好的是:)

{{1}}

JSFiddle: http://jsfiddle.net/TrueBlueAussie/ts1dqwe3/4/

答案 1 :(得分:0)

更新

  

我有类似的情况,我需要知道多个并行的时间   操作已经完成,但没有经历创建的开销   一系列承诺,仅用于调用

未使用

loop;只有1个}} ;通过$.when()实施时使用的模式相同。另外,添加&#34;随机&#34; $.map() jsfiddle ajax delay;在request完成所有并行函数调用,promise.then()调用,$.when()队列为空之前,不应调用next

queueName

jsfiddle http://jsfiddle.net/ts1dqwe3/10/

  

当顺序使用jQuery promises时,可以链接它们   然后反复使用   ...   这也适用于循环(非常方便)。

尝试使用function GetSomeDeferredStuff(elem, name, cycles) { var el = (elem || {}), queueName = (name || "q"), len = (cycles || 5), request = function () { return $.ajax({ type: "POST", url: '/echo/html/', data: { html: "<p>Task #" + $.now() + " complete.", delay: Math.random() * 5 }, success: function (data) { $("div").append(data); } }) } return $(el).queue(queueName, function (next) { return $.when(request() , request() , request() , request() , request()) .then(next) }).dequeue(queueName).promise(queueName); } $(function () { $("a").click(function () { var promise = GetSomeDeferredStuff(); promise.then(function () { $("div").append("<p>All done!</p>"); }); }); }); .queue()

.promise(queueName)

jsfiddle http://jsfiddle.net/ts1dqwe3/6/