2017-01-11 10 views
0

ノード6.9でネイティブな約定を使って非同期コードを書いています。古い約束が完了する前に、新しい約束が発砲している競争状態に気付いています。現在実行中の約束のIDを公開する

私はデバッグをプリントアウトしています。これは、あるプロミスの出力が他のプロンプトの出力とインターリーブされているため読みにくいです。どの関数が現在実行中であるかを識別する何らかの「id」を持つと便利です。例えば

function doWork() { 
    new Promise((resolve, reject) => { 
    console.log("queue ID", someId()) 
    // long-running processing happens 
    }) 
} 

doWork() 
-> queue ID 1 
doWork() 
-> queue ID 2 

注:私はprocess.idを探していませんよ。私が理解しているように、ノードは単一のプロセスで実行され、非同期I/Oがその中で発生するため、process.idの出力は役に立たない。

+1

あなたはちょうどあなたが 'I = 0'で始まり、ちょうどそれぞれの約束のために増分する場合は、簡単なカウンタがすべき、あなた自身作ることができます。おそらくあなたが探しているのは、あなたの関数内で約束を待ち行列に入れる方法ですが、 'new Promise'を複数回呼び出すだけでは、競合状態が発生しないはずです。 – adeneo

+0

問題を引き起こす2つの約束の間の競争状態は、正常に連鎖されておらず、他の仕上げが完了するまで実行されないということを意味します。あなたが求めていることは、約束のインフラに組み込まれていない。問題に関わる約束を知っている可能性が高いので、あなたがしようとしていることのコードを示して、問題の内容を説明すれば、本当の問題を手助けできるはずです。その代わりに、特定のデバッグ手法について尋ねました。私たちはむしろ本当の問題を助けたいと思っています。 – jfriend00

答えて

0

promise idのようなものはありません。名前付き関数を使用してコンソールログにあらかじめペンディングするか、クロージャを使用してidを表す任意の整数または文字列への参照を保持できます。

function doWork(someId) { 
    new Promise((resolve, reject) => { 
    console.log("queue ID", someId); 
    // long-running processing happens 
    }) 
} 

doWork(10) 
-> queue ID 10 
doWork(20) 
-> queue ID 20 
関連する問題