【发布时间】:2015-05-10 01:44:04
【问题描述】:
当顺序使用 jQuery Promise 时,可以重复使用 then 链接它们:
例如
promise = promise.then(someoperation());
这也适用于循环(非常方便)。
我有类似的场景,我需要知道多个并行操作何时完成,但不经历为调用而创建一组承诺的编码开销(例如增加的复杂性) $.when.apply
在查看了我的选项后,我想出了这个模式作为替代方案:
promise = $.when(promise, anotherpromise);
为了测试它,我想出了这个测试:
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/0rh8Lhv4/1/
这似乎工作得很好,所以我开始将它应用到 StackOverflow 上的其他示例。
我尝试使用此模式的下一个方法是修复 Pass in an array of Deferreds to $.when() 中的示例:
我的代码:
$("a").click(function () {
var promise = GetSomeDeferredStuff();
promise.then(function () {
$("div").append("<p>All done!</p>");
});
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/ts1dqwe3/1/
问。由于某种原因,这个永远不会触发最终事件。谁能发现问题?
更新
根据@Karl-André Gagnon 的评论,最初的promise 似乎可以未定义并且仍然有效。简单得多:
例如
var p;
[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");
});
【问题讨论】:
-
你说创建一个承诺数组将是开销。你认为多次调用
$.when的开销是多少?! -
另外,你最外层的promise最终解决的结果完全被搞砸了。
-
@Bergi:我的意思是编码开销。不是内存开销。开销是一系列承诺而不是承诺数组。关于你的第二条评论,你能用技术措辞澄清一下吗? “完全被搞砸了”并没有真正为我做这件事:)
-
我认为通过使用
map而不是forEach类型的循环可以减轻(甚至逆转)“编码开销”。在我的第二条评论中,我的意思是说p最终解决的值(应该是一个结果数组,并且是一个合理的解决方案)是完全无法使用的,它是某种嵌套元组(甚至不是一个缺点列表)
标签: javascript jquery promise jquery-deferred