让我们创建一个简单的 Deferred 对象:
defer = $.Deferred( function ( defer ) {
setTimeout( defer.resolve, 3000 );
});
上述 Deferred 对象将处于“pending”状态 3 秒,然后切换到“resolved”状态(此时将调用与其绑定的所有回调)。
让我们也检索该 Deferred 对象的承诺:
promise = defer.promise();
现在,要添加在 Deferred 对象被解析后将被调用的回调,我们可以使用.done()
or .then()
。但是,我们可以在 Deferred 对象本身或它自己的 Promise 对象上调用此方法。
defer.then( handler );
或者
promise.then( handler );
在这两种情况下,handler
都会调用该函数(在这种情况下是 3 秒后)。
如果我们使用$.when
,我们可以再次传递 Deferred 对象本身或其承诺对象:
$.when( defer ).then( handler );
或者
$.when( promise ).then( handler );
同样,上述两行代码之间没有区别。
现场演示:http: //jsfiddle.net/G6Ad6/
所以,我的问题是,既然我们可以在 Deferred 对象本身上调用.then()
,.done()
等,并且因为我们可以将该 Deferred 对象传递给$.when()
,那么.promise()
检索 Promise 对象的意义何在?承诺对象的目的是什么?为什么在功能上有这种冗余?