2016-05-31 2 views
1

私は約束を返すような呼びかけがあります。then()のbluebirdコールバックの引数を渡すには?

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

これはより実用的になります::

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

例えば、そのようなsetTimeout作品:

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

んブルーバードは、このための任意の方法を持っているこの瞬間、私はこれを行います?私の目的は、このの実用的なオプションを使用して、Promisesが生成するコードがすでにばかげているのを減らすことです。このとき

+0

は、残念ながらそれは、標準の約束/ A +の一部です:ちょうどあなたが() => console.log("Done.")またはいくつかの他の一般的なコールバックをたくさん使用している場合、それは別の関数にし、追加します/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then)、[このウェブサイト](https://promisesaplus.com/)でbluebirdは規則を適用しているだけでなく、プロミスの解決/拒否から返されたコールバックを持たなければなりません。なぜなら、それが空でなくてもデータで満たされていなくても関数でなければならないからです。 - 特にこの掲示板(https://promisesaplus.com/#point-35) – Andrei

+1

と編集しました。「残念ながら、これは約束/ A +標準の一部です」と言っています。 :)そうでなければ、それぞれの実装は、 "コードのばかげた量を減らすために、多少異なる突然のポリモフィック1を持つでしょう" –

答えて

1

、私はこれを行う:

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

これは正しいアプローチです。矢印機能はすでにこれを多く短縮しています。 "{" ... ";}"の部分を削除できます。

これは、より実用的になります:

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

ありません、それはないだろう。 thenの2番目のパラメータは、文字列ではなくonRejectedコールバックです。あなたはそれをすることはできません。

私の目的は、 約束が生成する、すでにばかげたコード量を減らすことです。

次に、async/awaitというシンタックスとトランスバータを使用してください。これは、このための任意の方法を持っているブルーバード

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

と同じくらい簡単ですか!

あなたがtranspilerを使用したいが、(最近のNode.jsのような)ES6環境にいるしない場合は、Promise.coroutineasync/awaitを模倣するために発電機の機能を使用することができます。

1

この機能は、かなりsetTimeoutに限定されています。 IE9以下では、とにかくポリフィルが必要ですhttps://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

console.logを使用している場合の回避策は次のとおりです。 thisを参照する関数で使用することには十分注意してください。 bindを使用してthisの値を設定するか、undefinedのままにします。また、最後の引数として値が自動的にbindに渡されるため、 "Done"の後に約束の解決された値が記録されます。

0

@Bergiはあなたの質問に優れた答えを与えました。/:あなたは[MDN](HTTPSに掲載されている見ることができるように

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

Something(...) 
    .then(afterSomething); 
関連する問題