2017-06-29 7 views
0

私の角張ったアプリケーションでは、私のサービスでメソッドを呼び出すことを約束していますが、何度か呼び出す必要があります。何度も呼び出しを約束します

for(let item of this.arrayName) 
{ 
    this.service.funcName(item.name).then(result => {     
     //handle result     
    }).catch(err => {     
     //handle error 
    }); 
} 

しかし、複数のコールから同時に結果を得るとどうなりますか?約束はそれをどう扱うかを知っていますか?それは別々に各結果を処理するのですか? またはコードをロックする必要がありますか?ありがとうございます。

+0

"約束を守る"ことはできません。約束を返す関数を呼び出すことができます。それぞれの呼び出しは(おそらく)別の約束を返すでしょう。 –

答えて

0

はい、プロミスはそれを処理する方法を「知っています」。 JavaScriptの性質です。 JavaScriptイベントループは、IO操作(ajax、indexeddb、filesystem etc ...)が終了すると、イベントループによって継続的に消費されるメッセージキューにコールバックが追加され、単一のスレッド上で実行されます。このようにして、競合状態を心配する必要はありません。さらに、ECMAScript仕様は、競合状態が発生する可能性があるすべての場所を隠すように注意深く設計されています。

これが、ブロックコードの作成を避ける必要がある理由です。コードがブロックされると、EventLoop全体がブロックされます。今日、JavaScriptでこのようなブロッキングコードを作成するのは本当に難しいですが、それでも不可能ではありません。

あなたはthis.arrayName内の各アイテムの1つの約束を作成して何をして

0

Concurrency model and Event Loop on MDNを参照してください。

各項目の処理が完全に独立している限り、これは正常に動作します。しかし、注意する必要があることは、約束が解決されてその後処理される前に、コードの実行がforループを超えて継続することです。だからあなたはかもしれないすべての約束が完全に解決するのを待ってから、続行してください。

は、次のようなものでこれを行うことができます。

Promise.all(this.arrayName.map(name => { 
    return this.service.funcName(name).then(result => {     
     //handle result     
    }).catch(err => {     
     //handle error 
    }); 
}) 
.then(...) // all success - do success case 
.catch(...) // some failed - handle error case 
0

正しいかどうSamir said。関数を呼び出すたびに、return文return new Promise(...)を呼び出します(これは、約束を使用するための予想される方法です)。

JavaScriptにもクロージャの概念があります。これは、関数に渡す引数がその関数の実行でのみ表示されることを意味します。ループがitemを変更したとき(「オーバー閉じて」いるオブジェクト参照を含むすべてのプリミティブは、そう、それは前の関数の呼び出しには影響を与えません。

唯一の問題は、依頼する左

は、あなたが本当に彼らはすべて並列に実行するかどうかであります

Observablesを使用しているので、Observablesをチェックアウトしています(これは、使用時には多少の熟練度があります)。しかし、あなたが持っているループは、以前の約束を待たずにすべてを実行します。

私を助けてくれた紹介Observablesはこれを理解しています。https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

関連する問題