Node.js等待for循环中的每次迭代

时间:2017-08-29 12:39:48

标签: javascript node.js loops asynchronous

我有一个for循环

for (let i = 0; i < options.length; i++) {
        console.log("Entered the to for " + i);
        let employee = await this.prolesChecker.getEmployeesFromEmail(options[i]);
        let isOnVacation = await this.prolesChecker.isOnVacation(employee, moment());
    }

两个函数“getEmployeesFromEmail和isOnVacation”正在连接到数据库,它们需要一些时间才能返回结果。 我希望for循环等到返回结果然后进入下一次迭代。

作为示例,console.log始终打印

Entered the to for 0

它永远不会进入i = 1

这是函数

 public async deleteEmailsTo(options: any) {
    console.log(options.length);
    for (let i = 0; i < options.length; i++) {
        console.log("Entered the to for " + i);
        let employee = await this.prolesChecker.getEmployeesFromEmail(options[i]);
        let isOnVacation = await this.prolesChecker.isOnVacation(employee, moment());
        if ((!employee.EmailReminders && !isOnVacation) || (!employee.EmailReminders && !employee.EmailRemindersForHoliday && isOnVacation)) {
            let index = options.indexOf(options[i], 0);
            if (index > -1) {
                options.splice(index, 1);
                console.log("Removed " + employee.Name + " " + employee.LastName + " from the 'to' list");
            }
        }
    }
}

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您的问题实际上与async / await语法不同,后者运行正常。它是关于在迭代期间使用splice的!这会改变数组的.length,并且下一次迭代不会因为循环条件不再适用而不会发生。

如果您必须改变传递的数组,请递减index计数器以考虑长度的变化:

for (let i = 0; i < options.length; i++) {
    …
    if (…) {
        let index = i; // no point in using `options.indexOf(options[i], 0);`
        // if (index > -1) { always true
        options.splice(index--, 1);
//                     ^^^^^^^
    }
}

但是简单地创建一个新数组可能要容易得多:

let result = [];
for (let i = 0; i < options.length; i++) {
    …
    if (!…) {
        result.push(options[i]);
    }
}
return result;