繁体   English   中英

如何在for循环中处理异步函数和回调?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM