这是一个人为的例子:http://jsfiddle.net/adamjford/YNGcm/20/
HTML:
<a href="#">Click me!</a>
<div></div>
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
function getSomeDeferredStuff() {
var deferreds = [];
var i = 1;
for (i = 1; i <= 10; i++) {
var count = i;
deferreds.push(
$.post('/echo/html/', {
html: "<p>Task #" + count + " complete.",
delay: count
}).success(function(data) {
$("div").append(data);
}));
}
return deferreds;
}
$(function() {
$("a").click(function() {
var deferreds = getSomeDeferredStuff();
$.when(deferreds).done(function() {
$("div").append("<p>All done!</p>");
});
});
});
Run Code Online (Sandbox Code Playgroud)
我想要"全部完成!" 在所有延迟任务完成后$.when()出现,但似乎不知道如何处理Deferred对象数组."全部完成!" 首先发生的是因为数组不是Deferred对象,所以jQuery继续并假设它刚刚完成.
我知道可以将对象传递给函数,$.when(deferred1, deferred2, ..., deferredX) …
想象一下我们想要在'foo'和'bar'的并发请求成功完成后执行某些操作的情况,或者如果其中一个或两个都失败则报告错误:
$.when($.getJSON('foo'), $.getJSON('bar'))
.then(function(foo, bar) {
console.log( 'I fire if BOTH requests are successful!' );
})
.fail(function() {
console.log( 'I fire if one or more requests failed.' );
});
Run Code Online (Sandbox Code Playgroud)
我怎样才能确定1)'foo'请求失败,或2)'bar'请求失败,或3)如果两者都失败了?
我有许多需要完成的异步任务,所以我使用的是promises.
我需要检测每个承诺何时被执行(解决和拒绝).在此之前我不能继续执行.
我使用的是这样的东西:
$.when(promise1, promise2, ...).always();
Run Code Online (Sandbox Code Playgroud)
但是这个代码是错误的,因为该when方法具有惰性求值,并且只要其中一个promise失败就会返回.因此,always只要其中一个承诺失败,回调也会运行.
我想在编码一个解决办法,但这种使用情况是如此普遍,也许有人已经做它已经,或者也许甚至还有这样做只使用jQuery的的一种方式(如果不是,这将是很好添加Promise.whenNonLazy或Promise.when(promise1, promise2, ..., false)在未来.
这可能吗?