2016-12-28 20 views
5

SOがそのような質問の正しい場所であるかどうかわかりません。'Promise'を使用すると 'Promise'を使用しない場合:どの場合ですか?

私は少しPromisesを知っているし、データベースを照会するとき、私は(=何かをし、その後、DBの答えを待って)「修正」にNode/Express環境でNodeの非同期動作をそれらを使用しています。

しかし、私はそれらを使用するほど、使用しないときは分かりません。例えば

、私はここでPromise.allを使用すると、まったく理にかなっている場合、私は知らない...

.... 
for (var i = 0; i < rows.length; i++) { // loop over a CSV file by line 
    var cell = rows[i].split(/;/) 
    var origin = cell[1] 
    var destination = cell[2] 
    var id = cell[0] 
    Promise.all([origin, destination, id]).then((p) => {} 
... 

を(Google Matrix APIを照会ローカルスクリプトのために)このようなコードの一部を書きました.. 。

知るルールはありますか?私は行動しない?

私のスクリプトが正しい引数なし​​でfunctionを実行するという "危険"があることを知りたいのですが(argumentが "over"ではない別のfunctionから返されています)... ...?

ありがとうございました。

+6

プロビジョニングを使用すると、非同期プロセスに対処できます。非同期なものがなければ、約束を使う必要はありません。あなたの例では、 'origin'、' destination'と 'id'は**文字列**であり、約束ではありません。これらの値を 'Promise.all'に渡すのは意味がありません。私はあなたが本当に解決している問題を本当に理解できるように約束について学び続けるべきだと思います。それでは、「使用しないとき」という質問が明白でなければなりません。 –

+0

上記のケースでは、非同期ではないため、Promisesを使用しません。通常、コールバックが必要な場合や、非同期動作が完了するのを待っている場合はいつでも、約束を使用します。 –

+0

'Promise.all(list)'は、 'list'で約束したすべての約束を実行する約束を返しますが、...セルのリストを渡していますか?テキスト?確かに約束ではありません。 – ranisalt

答えて

2

完全同期コード(完了を追跡しようとしている非同期操作はありません)がある場合、約束を使用したくありません。

同期コードで約束を使用しようとすると、コードのロジックに不要な複雑さが加わり、コードの実行が遅くなります。すべての同期コードでは、コードの完了を待つことはできません。コードを実行してすぐに結果を得ることができます。約束を追加するだけでコードが不必要に複雑になります。

さらに、Promise.all()は、あなたが約束の配列を渡すことを期待しています。あなたがそうしているような値の配列ではなく、あなたがやっていたことも間違っていました。

それでは、これを実行しないように、本当に理由はありません。

.... 
for (var i = 0; i < rows.length; i++) { // loop over a CSV file by line 
    var cell = rows[i].split(/;/) 
    var origin = cell[1] 
    var destination = cell[2] 
    var id = cell[0] 
    // operate on id, destination and origin here 
    // no need to wait on a promise before doing so 
} 
... 

約束は、などのデータベース操作、ファイル操作、ネットワークの運用、タイミング操作、...することができますように、非同期操作で使用されますそれらを使用して、個々の非同期操作がいつ行われたかを知るか、複数の操作(そのうちのいくつかは非同期です)を調整します。

3

私は通常、データベースからデータを取得するための呼び出しなど、非同期プロセスを使用している場合にのみ、約束を使用します。私は、非同期プロセスを扱っていない場合には、約束を使用する必要があると考えることはできません。一般

1

あなた自身を約束し、あなたが約束を使用するネイティブ使用していないあなたは現在、いくつかのasynchonousプロセス必要が使用しているもの理由:

  • httpリクエストクライアント側
  • データベース/その他の要求のサーバー側

通常、あなたがそれらのために使用するコネクタ/ライブラリは、Promiseまたはコールバックを提供しています。ここでは、約束をどこでも使用できるように解決できます。

別の非常に特殊な種類の非同期プロセスは、クライアント側が重いことをするときです(一般的にはそうすべきではありません!)、バックグラウンドで実行して非同期に解決する必要があります。

約束しておけばそれを解決できます。

JavaScriptがモノスレッド化されているため、「バックグラウンドで実行する」という意味を理解できなかった場合は、SO's postを参照してください。そのようなことは単なるエミュレーションです。

関連する問題