1 回答

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
嗯,這是關(guān)于承諾解決方案的來源。Q和一堆其他庫提供了兩個(gè)API:
遺留
defer
API - 您可以在其中創(chuàng)建延期,.resolve(value)
并且它具有您可以返回的承諾。promise構(gòu)造函數(shù) - 這是一個(gè)現(xiàn)代API,您可以在其中從完成源創(chuàng)建承諾。
粗略地做:
var d = Q.defer();setTimeout(function(){ d.resolve(); }, 1000); return d.promise;
是相同的:
return new Promise(function(resolve, reject){ setTimeout(resolve, 1000);});
所以你可能會(huì)問
為什么我們需要兩個(gè)API?
好吧,推遲API首先出現(xiàn)。這是其他語言處理它的方式,它是文章處理它的方式,也是人們首先使用它的方式 - 然而 - 這兩種API之間存在著重要的區(qū)別。promise構(gòu)造函數(shù)是安全的。
投擲安全
承諾抽象異常處理并保持安全。如果你扔進(jìn)一個(gè)承諾鏈,它會(huì)將該異常轉(zhuǎn)換為拒絕,引用規(guī)范:
如果onFulfilled或onRejected引發(fā)異常e,則必須拒絕promise2,并將e作為原因
假設(shè)您正在從XHR請(qǐng)求中解析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); }); }}
現(xiàn)在,讓我們看看promise構(gòu)造函數(shù)版本:
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); } });}
現(xiàn)在,假設(shè)您的服務(wù)器以某種方式向您發(fā)送了無效的JSON(或者用戶將其編輯為無效狀態(tài))并緩存了它。
在延遲版本中 - 它會(huì)同步拋出。所以你必須一般防范它。在底部版本它沒有。最高版本的用法如下:
try{ return get().catch(function(e){ return handleException(e); // can also just pass as function });} catch(e){ handleException(e);}
在底部版本中 - promise構(gòu)造函數(shù)會(huì)將throw
s 轉(zhuǎn)換為拒絕,因此它足以做到:
return get().then(function(e){ return handleException(e);});
防止一整類程序員錯(cuò)誤發(fā)生。
添加回答
舉報(bào)