[英]How to handle asynchronous function and callback in for loop?
我有以下片段:
var request = require('request');
var randomNumber1 = 656;
var randomNumber2 = 879;
var dataCollected = []
function printNumberOfCollectedData() {
console.log('I collected ' + dataCollected.length + ' data so far.');
}
function getAsyncLoadedData(cb) {
request.get('https://api.bitfinex.com/v2/candles/trade:1m:tBTCUSD/hist?limit=1&end=1517158020000&duration=1800', function (err, res, body) {
if (err) {
//TODO: handle err
}
if (res.statusCode === 200) {
console.log(body)
cb(body)
} //etc
//TODO Do something with response
});
}
for (var n = 0; n < 1000; n++) {
if (n === randomNumber1) {
getAsyncLoadedData(function (data) {
dataCollected.push(data);
})
}
if (n === randomNumber2) {
printNumberOfCollectedData();
}
}
我的问题是,只有在dataCollected.push(data);之后才应调用printNumberOfCollectedData ; 基本上,我想冻结for循环,直到调用getAsyncLoadedData的回调为止。
也许您需要异步瀑布? https://www.npmjs.com/package/async-waterfall
它提供了一个模型,其中多个回调函数一个接一个地执行,每个回调函数将其结果传递给下一个。
您不应将for循环与异步代码一起使用。 尝试使用自调用函数:
var max_iterations = 1000;
function loop(n) {
if (n === randomNumber1) {
getAsyncLoadedData(function (data) {
dataCollected.push(data);
setImmediate(function () { loop(n+1)});
})
}
else if (n === randomNumber2) {
printNumberOfCollectedData();
setImmediate(function () { loop(n+1)});
}
else if (n < max_iterations) {
setImmediate(function () { loop(n+1)});
}
}
loop(0);
我使用异步/等待功能解决了它。 可以在此处找到更多详细信息。 我更改了这样的代码:
async function runForLoop() {
for (var n = 0; n < 1000; n++) {
if (n === randomNumber1) {
await getAsyncLoadedDataPromise(function (data) {
dataCollected.push(data);
});
}
if (n === randomNumber2) {
printNumberOfCollectedData();
}
}
}
runForLoop()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.