javascript - 如何使用 async/await 同步而不是异步触发 forEach() ?

标签 javascript promise

我有以下代码:

console.log("TEST 1");
accounts.forEach(async function(account) {
    console.log("TEST 2");
    try {
        var data = await getReservations(account);
    } catch(err) {
        res.status(err.error_code).json(err);
    }
    console.log("TEST 3");
});
console.log("TEST 4");

运行时,控制台显示:

TEST 1
TEST 2
TEST 4
getReservations()
TEST 3

但我希望它等待 getReservations() 完成,然后再继续经过 forEach()。我希望它输出:

TEST 1
TEST 2
getReservations()
TEST 3
TEST 4

有什么想法吗?

最佳答案

这是常规 for 循环效果更好的一次 - 下面的代码包装在 IIFE 中,因此可以使用 await

var accounts = [1, 3];
var getReservations = (account) => new Promise(resolve => setTimeout(resolve, 1000, account*2));
(async function() {
    console.log("TEST 1");
    for(var i = 0, l = accounts.length; i < l; i++) {
        let account = accounts[i];
        console.log("TEST 2");
        try {
            var data = await getReservations(account);
        } catch(err) {
            console.error(err);
        }
        console.log("TEST 3");
    };
    console.log("TEST 4", data); // data should be 6
})();

NOTE: anything AFTER the IIFE will not "await"

关于javascript - 如何使用 async/await 同步而不是异步触发 forEach() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43533862/

相关文章:

javascript - Ruby on Rails - gmaps4rails - 传递标记数据。超出最大调用堆栈大小

javascript - if 语句更新变量

javascript - Ember.js 将数据存储中的两个对象合并为一个字符串

javascript - 如何暂停在链中间延迟的 jQuery 解析?

javascript - 从 Django 中同一页面上的多个按钮发起 AJAX 请求

javascript - 一个盒子不适合不同的屏幕分辨率

javascript - 解决未在递归 Promise 函数中调用的问题

javascript - 根据旧状态和 promise 结果计算新状态

javascript - 混淆 error 和 reject in Promise

javascript - 在 Firefox 中点击 input inside 按钮