当顺序使用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
答案 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}}
答案 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/