Passing A Variable To A Request-promise Function Inside A ForEach Loop
Solution 1:
This happens due to the fact, that the function in the .then()
is executed after the request-promise resolves, which takes some time. In the meanwhile the forEach
-loop finishes and assigns the last asset
to exchange_pair_id
- which in your code is a global variable as a proper declaration is missing (see below)! After that the first request-promises begin to resolve and execute their callback, but at this time the forEach
-loop is already finished so exchange_pair_id
will always log the same value.
To avoid that exchange_pair_id
is in the global scope, you should use a ,
instead of ;
after var assets = asset['assets'];
(second line). Or simply add another var in front of exchange_pair_id = asset['exchange_pair_id'];
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
});
});
- Declared variables are constrained in the execution context in which they are declared. Undeclared variables are always global.
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var)
Anyway I recommend you to use let
in order to declare variables as it may sometimes prevent undesirable behaviour of your code. See the MDN docs on let
to get to know what it does - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
Solution 2:
Here you are experiencing an asynchronous problem.
When you execute the forEach you push tasks into the node.js to do list.
Then when you function stop, they get executed and access id.
Post a Comment for "Passing A Variable To A Request-promise Function Inside A ForEach Loop"