讓我們創建一個簡單Deferred對象:Deferred對象和它自己的承諾對象之間有什麼區別?
defer = $.Deferred(function (defer) {
setTimeout(defer.resolve, 3000);
});
上述Deferred對象將在「未決」狀態3秒鐘,然後切換到「解決」狀態(在該點處結合到所有回調它將被調用)。
我們也檢索Deferred對象的承諾:
promise = defer.promise();
現在,要添加的打算,一旦遞延對象是解決被調用回調,我們可以使用.done()
或.then()
。但是,我們可以在Deferred對象本身或它自己的承諾對象上調用這兩種方法。
defer.then(handler);
或
promise.then(handler);
在這兩種情況下,該功能handler
將被調用(在這種情況下在3秒後)。
如果我們使用$.when
,我們可以再次通過遞延對象本身或它的承諾對象:
$.when(defer).then(handler);
或
$.when(promise).then(handler);
同樣,有上面的代碼的兩行之間沒有差異。
現場演示:http://jsfiddle.net/G6Ad6/
所以,我的問題是,因爲我們可以遞延對象本身調用.then()
,.done()
等,因爲我們可以通過遞延對象爲$.when()
,有什麼的.promise()
點並檢索承諾對象?承諾對象的目的是什麼?爲什麼這種功能冗餘?
啊這是一個封閉的副本*呃* ...解釋它。 –
爲了讓我更加清楚這點,從[docs](http://api.jquery.com/Types/#Promise):「Promise Object - 這個對象提供了一個子集的方法延遲對象(然後,完成,失敗,始終,管道和狀態)以防止用戶更改延遲狀態。「 –