我知道有几篇关于这个的帖子,但根据我发现的那些帖子,这应该可以正常工作。
我想在一个循环中发出一个 http 请求,并且我不希望循环在请求回调被触发之前进行迭代。我正在使用异步库,如下所示:
const async = require("async");
const request = require("request");
let data = [
    "Larry",
    "Curly",
    "Moe"
];
async.forEachOf(data, (result, idx, callback) => {
    console.log("Loop iterated", idx);
    let fullUri = "https://jsonplaceholder.typicode.com/posts";
    request({
        url: fullUri
    }, 
    (err, res, body) => {
        console.log("Request callback fired...");
        if (err || res.statusCode !== 200) return callback(err);
        console.log(result);
        callback();
    });
});
我看到的是:
Loop iterated 0
Loop iterated 1
Loop iterated 2
Request callback fired...
Curly
Request callback fired...
Larry
Request callback fired...
Moe
我需要看到的是:
Loop iterated 0
Request callback fired...
Curly
Loop iterated 1
Request callback fired...
Larry
Loop iterated 2
Request callback fired...
Moe
另外,如果有一个内置的方法来做同样的事情(async/await?Promise?)并且可以删除异步库,那就更好了。
我已经看到了一些很聪明的递归示例,但是当我将其用于更复杂的情况(例如每个循环多次请求调用等)时,我觉得这种方法很难遵循,并且不那么可读。