2016-05-31 46 views
1

我有一個回覆承諾的電話。在這一刻,我這樣做:如何在then()中傳遞bluebird回調參數?

Something(...) 
    .then(()=>{console.log("Done.");}); 

這將是更實際:

Something(...) 
    .then(console.log, "Done."); 

例如,setTimeout作品那樣:

setTimeout(console.log, 1000, "Done."); 

確實藍鳥有這方面的任何方法?我的目標是讓這個實用的選項來減少Promise產生的已經很荒謬的代碼量。

+0

不幸的是它的諾言/ A的一部分+標準,你可以在[MDN(HTTPS見上市:/ /developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then),並在[本網站](https://promisesaplus.com/)藍鳥只是執行規則,你也必須有一個從promise/reject中返回的回調,這就是爲什麼它必須是一個函數,不管它是空的還是充滿數據的。 - 特別是在這個公告[在這裏](https://promisesaplus.com/#point-35) – Andrei

+1

編輯「不幸的是它是承諾/ A +標準的一部分」我會說**幸運**。 :)否則,每個實現都會有略微不同的突然多態性「減少代碼的可笑數量等等等等等等等等」 –

回答

1

在這一刻,我這樣做:

Something(…).then(()=>{console.log("Done.");}); 

這是正確的做法。箭頭功能已經縮短了很多。請注意,您可以刪除「{」...「」;}「零件。

這將是更實際:

Something(…).then(console.log, "Done."); 

不,不會。 then的第二個參數是onRejected回調,而不是字符串。你不能那樣做。

我的目標是減少 承諾產生的已經很荒謬的代碼量。

然後用async/await語法和一個轉譯器。它是那樣簡單

await Something(…); 
console.log("Done"); 

確實藍鳥有這方面的任何方法?

如果你不喜歡使用transpiler但在ES6環境(如最近的Node.js),你可以使用發電機的功能模仿async/awaitPromise.coroutine

1

該功能與setTimeout幾乎相同。 IE9及以下版本需要使用polyfill https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

以下是使用console.log的示例案例的解決方法。謹慎使用任何引用this的函數。您可以使用bind來設置值this或保留undefined。此外,由於該值會自動作爲bind的最後一個參數傳遞,因此它將在「完成」之後記錄已解析的承諾值。

Something(...) 
    .then(console.log.bind(undefined, "Done.")); 
0

@Bergi對你的問題給出了很好的答案。我想補充,如果你使用() => console.log("Done.")或其他一些通用的回調很多,使它成爲一個獨立的功能:

function afterSomething() { 
    console.log("Done."); 
} 

Something(...) 
    .then(afterSomething);