Я использую node.bittrex.api без проблем. Я просматриваю цикл записей и вызываю getticker для каждой записи. Вызов getticker возвращает значения async, которые являются точными, но мне нужны другие данные из записи за пределами цикла, и к этому времени цикл прошел до конца, и мой обратный вызов использует только значения из последней записи в валютах массив, который как и ожидалось.
var currencies = [{code:'btc-eth', fee:0.2},{code:'btc-ltc', fee:0.1},{code:'btc-ada', fee:0.5}];
for (index in currencies) {
bittrex.getticker({ market: currencies[index].code }, function (data, err) {
console.log("Currency: " + currencies[index].code);
console.log("Fee: " + currencies[index].fee);
console.log("Ticker: " + data);
});
}
Это можно сделать БЕЗ сквозных параметров (что я могу сделать, но не хочу разветвлять пакет).
Вы можете сделать это, используя немедленную функцию.
var currencies = [{code:'btc-eth', fee:0.2},{code:'btc-ltc', fee:0.1},{code:'btc-ada', fee:0.5}];
for (index in currencies) {
(function(idx){
bittrex.getticker({ market: currencies[idx].code }, function (data, err) {
console.log("Currency: " + currencies[idx].code);
console.log("Fee: " + currencies[idx].fee);
console.log("Ticker: " + data);
});
})(index);
}
Это также можно записать как, для краткости:
var currencies = [{code:'btc-eth', fee:0.2},{code:'btc-ltc', fee:0.1},{code:'btc-ada', fee:0.5}];
for (index in currencies) {
f(index);
}
function f (idx){
bittrex.getticker({ market: currencies[idx].code }, function (data, err) {
console.log("Currency: " + currencies[idx].code);
console.log("Fee: " + currencies[idx].fee);
console.log("Ticker: " + data);
});
}
Если вы используете let
версию узла и избегаете IIFE,
for ( let index in currencies)
(index)
в конце определения функции. Это гарантирует, что ваш текущий индекс будет записан как idx в закрытии, и ваш обратный вызов будет использовать этот idx