私は現在約束事を実験しており、本当に基本的な質問があります!ES6 Promises - 約束のチェーン内で同期関数を呼び出す
約束の範囲内では、同期関数を呼び出すことは悪い習慣ですか?たとえば、
また、私の同期関数も約束を返すようリファクタリングする必要がありますか?
私は現在約束事を実験しており、本当に基本的な質問があります!ES6 Promises - 約束のチェーン内で同期関数を呼び出す
約束の範囲内では、同期関数を呼び出すことは悪い習慣ですか?たとえば、
また、私の同期関数も約束を返すようリファクタリングする必要がありますか?
約束の範囲内で、同期 関数を呼び出すことは悪い習慣ですか?
いいえ、まったく悪い習慣ではありません。それは多くの期待され、有用なプラクティスの一つです。
プロミスチェーン内の同期関数(.then()
ハンドラ内)または新しいプロミスを返す非同期関数を完全に呼び出すことは自由です。
.then()
ハンドラから何かを返すと、(親の約束の解決された値になる)値を返すこともできますし、別の約束を返すこともできます。拒絶された約束を返すようなものです(約束が拒絶される)。
したがって、同期関数を呼び出して値を取得するか、または非同期関数を呼び出して別の約束を得てから、.then()
ハンドラから戻すことができます。
これらの同期するものは完全に合法であり、それぞれ独自の目的を持っています。ここで.then()
ハンドラ内のいくつかの同期の出来事です:
// modify resolved value
someAsync().then(function(val) {
return val + 12;
});
// modify resolved value by calling some synchronous function to process it
someAsync().then(function(val) {
return someSynchronousFunction(val);
});
// synchronously check the value and throw to change the promise chain
// to rejected
someAsync().then(function(val) {
if (val < 0) {
throw new Error("value can't be less than zero");
}
return val;
});
// synchronously check the value and return a rejected promise
// to change the promise chain to rejected
someAsync().then(function(val) {
if (val < 0) {
return Promise.reject("value can't be less than zero");
}
return val;
});
はここ3件の同期.then()
ハンドラが続く約束を返し、その後、最終的な値を出力する非同期操作の少し例を示します
function delay(t, val) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(val);
}, t);
});
}
function increment5(val) {
return val + 5;
}
delay(500, 10).then(increment5).then(function(val) {
return val - 3;
}).then(function(final) {
document.write(final);
});
注:通常はすべてが同期していると、純粋な同期コードは実行が速く、書き易くなるため、非同期操作をしているとき、または非同期操作を行っているときに約束を使用することができます。しかし、すでに少なくとも1つの非同期操作がある場合は、同期操作とその非同期操作を混在させて、コードの構造を助ける約束を使用することができます。
多くのおかげで@ jfriend00 - 本当に非常に役立つ!御時間ありがとうございます。 – Ben
なぜdownvote?あなたがそれがダウンボートに値すると思った理由を説明するコメントを伴わない、一般的に受け入れられた回答の下降は、コミュニティにあまり貢献していません。あなたが説明すれば、著者はあなたの問題に対処するための答えを改善し、すべての人の答えを改善することができます。 Drivebyのdownvotingは他のコミュニティのためのものを改善するのに役立ちません。 – jfriend00
優れた答え。神話的な "決して同期する約束"よりもはるかに優れています。ありがとう。 – Kim
べきthen
コールバック関数:
「プロミスの中で」、私はあなたが「その後のハンドラ」の中にいると思いますか? –
はい、これを修正しましょう:D – trquoccuong
私はあなたが意味するものを理解していません。特定の部分をコード化する。 – Internial
可能な複製を投げるには、[作成します関数を使って非同期関数を使用する](http://stackoverflow.com/q/28993673/1048572) – Bergi
同期関数に約束を使用しないでください。 – Bergi