千萬里不及你
2019-07-30 17:23:23
defer()。promise和Promise之間的區別我知道推遲分離承諾狀態控制和處理,這里使用Q作為例子,承諾返回的承諾Q.defer().promise和Q.Promise完全不同,為什么設計這樣?這兩個“承諾”有什么區別提前致謝PS:我目前正在開發Promise庫,歡迎使用issws和PRS:https://github.com/jiananshi/Promise-polyfill
1 回答

森林海
TA貢獻2011條經驗 獲得超2個贊
嗯,這是關于承諾解決方案的來源。Q和一堆其他庫提供了兩個API:
遺留
defer
API - 您可以在其中創建延期,.resolve(value)
并且它具有您可以返回的承諾。promise構造函數 - 這是一個現代API,您可以在其中從完成源創建承諾。
粗略地做:
var d = Q.defer();setTimeout(function(){ d.resolve(); }, 1000); return d.promise;
是相同的:
return new Promise(function(resolve, reject){ setTimeout(resolve, 1000);});
所以你可能會問
為什么我們需要兩個API?
好吧,推遲API首先出現。這是其他語言處理它的方式,它是文章處理它的方式,也是人們首先使用它的方式 - 然而 - 這兩種API之間存在著重要的區別。promise構造函數是安全的。
投擲安全
承諾抽象異常處理并保持安全。如果你扔進一個承諾鏈,它會將該異常轉換為拒絕,引用規范:
如果onFulfilled或onRejected引發異常e,則必須拒絕promise2,并將e作為原因
假設您正在從XHR請求中解析JSON:
function get(){ var d = Q.defer(); if(cached) { // use cached version user edited in localStorage d.resolve(JSON.parse(cached)); } else { // get from server myCallbackApi('/foo', function(res){ d.resolve(res); }); }}
現在,讓我們看看promise構造函數版本:
function get(){ return new Promise(function(resolve, reject){ if(cached) { // use cached version user edited in localStorage resolve(JSON.parse(cached)); } else { // get from server myCallbackApi('/foo', resolve); } });}
現在,假設您的服務器以某種方式向您發送了無效的JSON(或者用戶將其編輯為無效狀態)并緩存了它。
在延遲版本中 - 它會同步拋出。所以你必須一般防范它。在底部版本它沒有。最高版本的用法如下:
try{ return get().catch(function(e){ return handleException(e); // can also just pass as function });} catch(e){ handleException(e);}
在底部版本中 - promise構造函數會將throw
s 轉換為拒絕,因此它足以做到:
return get().then(function(e){ return handleException(e);});
防止一整類程序員錯誤發生。
添加回答
舉報
0/150
提交
取消