2015-05-11 68 views
2

有沒有人對ES6承諾有任何想法,我在我的Node應用程序中使用它們,我大部分都喜歡它們。但是我發現,如果我在解析回調中遇到某種錯誤,它不會拋出錯誤或執行拒絕回調,並且使我無限次地掛起服務器。ES6中的捕獲錯誤承諾

現在我已經採取了這樣做,並手動拒絕承諾與抓住錯誤,但我不知道這是一個偉大的方式來處理,和/或如果我應該使用承諾。

this.dataStore.set(newID, value).then((foo) => { 
    try{ 
     this.var = foo; 
     res({val: foo}); 
    }catch(e){ 
     rej(e); 
    } 
}, (e) => { 
    rej(e); 
}); 
+0

失敗請問您的代碼工作正確原來的樣子,而你只是在尋找一個更好的* *解決方案? – apsillers

+1

'res'和'rej'從哪裏來?這看起來很像['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572) – Bergi

+0

這看起來有點像http://petkaantonov.github.io/bluebird/web/文檔/抗patterns.html#的,。那麼 –

回答

4

我覺得困惑的一個事實,即,根據您所使用的res,併產生rej這裏,你很可能從一個承諾構造函數中調用這個,沿

function setStore(newID, value) { 
    return new Promise(function(res, rej) { 
     this.dataStore.set(newID, value).then((foo) => { 
      try{ 
       this.var = foo; 
       res({val: foo}); 
      }catch(e){ 
       rej(e); 
      } 
     }, (e) => { 
      rej(e); 
     }); 
    }); 
} 

順便說一句,末尾的(e) => { rej(e); }部分可以改寫爲e => rej(e),而這又可以改寫爲rej

但無論如何,你不需要任何周邊機器來創建並返回自己的諾言,因爲this.dataStore.set和/或隨後的呼叫then已經創建一個承諾,你可以回原樣。而不是創建自己的新承諾,然後根據傳遞給then的結果用小散列解決新的承諾,只需返回散列 - 這將成爲所得承諾的價值。當呼叫dataStore.set失敗時,不要拒絕你的新承諾,只要讓失敗的承諾成爲自己。

所以,你應該不需要做任何事情比

function setStore(newID, value) { 
    return this.dataStore.set(newID, value).then(foo => { 
     this.var = foo; 
     return {val: foo}; 
    }); 
} 

發生在this.var = foo; return {val: foo};部分錯誤更復雜(但怎麼可能呢?)會自動拋出承諾到故障狀態。由於this.dataStore.set而導致的失敗將會產生失敗的承諾,因此無需趕上它並重新拋出它 - 失敗將順利進行。

以此爲:

setStore('abc', 123) . 
    then(hash => console.log(hash.val)) . 
    catch(e => console.log("The sky is falling", e)); 

作爲澄清的問題,如下所示:

promise . then(success, failure) 

success回調產生的誤差failure回調處理。在回調的連續階段將會處理success回調失敗。你可以把手success(或promise本身)與

promise .then(success) . catch(failure)