亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

defer()。promise和Promise之間的區別

defer()。promise和Promise之間的區別

千萬里不及你 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:

  • 遺留deferAPI - 您可以在其中創建延期,.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構造函數會將throws 轉換為拒絕,因此它足以做到:

return get().then(function(e){
   return handleException(e);});

防止一整類程序員錯誤發生。


查看完整回答
反對 回復 2019-07-30
  • 1 回答
  • 0 關注
  • 1049 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號