我覺得困惑的一個事實,即,根據您所使用的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)
失敗請問您的代碼工作正確原來的樣子,而你只是在尋找一個更好的* *解決方案? – apsillers
'res'和'rej'從哪裏來?這看起來很像['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572) – Bergi
這看起來有點像http://petkaantonov.github.io/bluebird/web/文檔/抗patterns.html#的,。那麼 –