在for循环中按顺序执行promise

时间:2016-01-05 15:25:37

标签: javascript node.js promise

我在循环中链接两个承诺,所以第二个承诺,直到承诺一解决后才开始。

我看到了一个减少的例子。无法让它发挥作用。如果我就这样做,就像我现在所做的那样,代码并行执行 - 就像所有异步请求都被触发一样,当然结果也搞砸了。请看一下:

for ( var i = 0; i < dummyData.accounts.length; i++) {
  var cursorUser = dummyData.accounts[i];
  var auth0User = {
    email: cursorUser.email,
    password: 'abc123',
    connection: 'Username-Password-Authentication'
  };
  createUser(api, auth0User)
    .then(function (auth0Info) {
      return auth0Info;
    })
    .then(function(auth0Info) {
      cursorUser.authProfile = auth0Info;
      console.log("account: ", cursorUser);
      return create(accountsAPIService, cursorUser);
    })
}

2 个答案:

答案 0 :(得分:4)

简单地避免for循环进行异步工作。

对于这类事情,数组有forEachmap等功能方法。

var pendingResults = dummyData.accounts.map(function (account) {
    return createUser(api, {
        email: account.email,
        password: 'abc123',
        connection: 'Username-Password-Authentication'
    }).then(function (authInfo) {
        console.log("account: ", authInfo);
        return create(accountsAPIService, authInfo);
    });
});

Promise.all(pendingResults).then(function (results) {
    // everything is done
});

答案 1 :(得分:2)

请参阅@Tomalak's answer了解实际解决方案。

问题是for子句不会为变量创建新范围。换句话说,您的代码被理解为:

var i, cursorUser, auth0User;
for (i = 0; i < dummyData.accounts.length; i++) {
  cursorUser = dummyData.accounts[i];
  auth0User = {
    // ...
  };
  // ...
}

当异步承诺得到解决时,另一个迭代可能已经覆盖了cursorUser变量:then回调无法再读取启动其承诺的迭代值。