2017-09-20 16 views
0

正しく動作する価格データのAPIを呼び出しています。しかし、私は変数exchange_pair_idthen()関数に渡そうとしています。forEachループ内のrequest-promise関数に変数を渡す

forEachループの内部では、exchange_pair_idはそれぞれassetに対して正しいです。しかし、then()関数内では、この変数は常に同じです(forEachループの最後の値)。

私はここでは、非同期の問題が発生しているthen(function(response) {...}

response.forEach(function(asset) { 
    var assets = asset['assets']; 
     exchange_pair_id = asset['exchange_pair_id']; 

    options.uri = exchange_objects[exchange[0]].ticker + '?pair=' + assets[0] + assets[1]; // overwrite to fit the request to Kraken API 

    console.log(exchange_pair_id) // unique 

    rp(options).then(function(response) { 
     key = Object.keys(response['result']); 
     price_data = response['result'][key]; 

     console.log(exchange_pair_id) // duplicate 
    });     
}); 
+3

これはうまくいくはずです。コールバック関数のコンテキストで毎回exchange_pair_idを定義するので、試してみてください –

+0

@MarouenMhiriは、あなたの変数を適切にスコープする必要があると言います。 'var'、' let'または 'const'というキーワードのない各変数はグローバル変数です。あなたはforEachでスコープを設定したいので、 'var exchange_pair_id;'と書くことが重要です。 –

+0

両方のおかげで、私は今朝何時間も動揺してしまった非常にアマチュアなミス。変数の適切な宣言を理解していないため、私のせいです。 – Nick

答えて

1

これは、要求の約束は、いくつかの時間を要しており、解決後.then()で関数が実行されていることを、事実のに起こります。一方、forEach -loopが終了し、最後のassetexchange_pair_idに割り当てられます。これは、適切な宣言が欠落しているため、コード内のグローバル変数です(下記参照)。その後、最初のリクエスト・プロミスがコールバックを解決して実行し始めますが、現時点ではforEach -loopが完了しているので、exchange_pair_idは常に同じ値を記録します。

exchange_pair_idがグローバルスコープになるのを避けるには、var assets = asset['assets'];(2行目)の後に;の代わりに,を使用する必要があります。それとも単に​​

response.forEach(function(asset) { 
    var assets = asset['assets'], // <---- use ',' instead of ';' 
     exchange_pair_id = asset['exchange_pair_id']; 

    options.uri = exchange_objects[exchange[0]].ticker + '?pair=' + assets[0] + assets[1]; // overwrite to fit the request to Kraken API 

    console.log(exchange_pair_id) // unique 

    rp(options).then(function(response) { 
     key = Object.keys(response['result']); 
     price_data = response['result'][key]; 

     console.log(exchange_pair_id) // duplicate 
    });     
}); 
  1. 宣言された変数は、それらが宣言されている実行コンテキストに拘束されているの前に別のVARを追加します。宣言されていない変数は常にグローバルです。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/varは)とにかく私はあなたがそれは時々あなたのコードの望ましくない動作を妨げる可能性として変数を宣言するためにletを使用することをお勧めします。あなたが "let exchange_pair_id = asset ['exchange_pair_id'];"を使用する場合には、letにあるMDNドキュメントを参照してください。

0

exchange_pair_id変数を渡すようにしようとしています。

forEachを実行すると、taskをnode.jsにプッシュしてリストを作成します。

enter image description here

あなたがストップ機能ときに、彼らが実行され、アクセスIDを取得。

enter image description here

関連する問題