2015-12-18 10 views
14

私は現在約束事を実験しており、本当に基本的な質問があります!ES6 Promises - 約束のチェーン内で同期関数を呼び出す

約束の範囲内では、同期関数を呼び出すことは悪い習慣ですか?たとえば、

また、私の同期関数も約束を返すようリファクタリングする必要がありますか?

+0

可能な複製を投げるには、[作成します関数を使って非同期関数を使用する](http://stackoverflow.com/q/28993673/1048572) – Bergi

+0

同期関数に約束を使用しないでください。 – Bergi

答えて

26

約束の範囲内で、同期 関数を呼び出すことは悪い習慣ですか?

いいえ、まったく悪い習慣ではありません。それは多くの期待され、有用なプラクティスの一つです。

プロミスチェーン内の同期関数(.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つの非同期操作がある場合は、同期操作とその非同期操作を混在させて、コードの構造を助ける約束を使用することができます。

+0

多くのおかげで@ jfriend00 - 本当に非常に役立つ!御時間ありがとうございます。 – Ben

+1

なぜdownvote?あなたがそれがダウンボートに値すると思った理由を説明するコメントを伴わない、一般的に受け入れられた回答の下降は、コミュニティにあまり貢献していません。あなたが説明すれば、著者はあなたの問題に対処するための答えを改善し、すべての人の答えを改善することができます。 Drivebyのdownvotingは他のコミュニティのためのものを改善するのに役立ちません。 – jfriend00

+0

優れた答え。神話的な "決して同期する約束"よりもはるかに優れています。ありがとう。 – Kim

2

べきthenコールバック関数:

  • リターン別の約束
  • リターン(未定義または)、同期値
  • は、同期エラーにの
+0

「プロミスの中で」、私はあなたが「その後のハンドラ」の中にいると思いますか? –

+0

はい、これを修正しましょう:D – trquoccuong

+0

私はあなたが意味するものを理解していません。特定の部分をコード化する。 – Internial

関連する問題