var d1 = $.Deferred();
var d2 = $.Deferred();
d1.resolve( "Fish" );
d2.resolve( "Pizza" );
// adding callbacks
$.when( d1, d2 ).done(function ( v1, v2 ) {
console.log( v1 ); // "Fish"
console.log( v2 ); // "Pizza"
});
在上面的示例中,即使在延迟解决后立即添加回调(立即),但仍然在控制台上打印“Fish”和“Pizza”。
有人可以向我解释一下,我哪里出错了?
答案 0 :(得分:2)
这是预期的行为,没有任何错误。如果您向已经解决的承诺添加.then()
处理程序,它仍将根据您添加到的承诺的状态调用刚刚添加的.then()
回调。
$.when()
也是如此。即使您传递的承诺都已经解决,它仍然会调用您添加到.then()
返回的承诺的$.when()
处理程序。
承诺“记住”他们的已解决/拒绝状态,以便即使已经解决/拒绝,也可以轻松访问它们。
承诺的一个重要特征是你可以添加.then()
个处理程序,如果/当承诺得到满足时会被调用 - 无论何时发生(立即,某个时候或未来)。您,使用承诺的开发人员不必担心实现的时间,包括是否已经发生。无论时间如何,您的代码都将执行相同的操作。这是承诺之美。