我在循环中链接两个承诺,所以第二个承诺,直到承诺一解决后才开始。
我看到了一个减少的例子。无法让它发挥作用。如果我就这样做,就像我现在所做的那样,代码并行执行 - 就像所有异步请求都被触发一样,当然结果也搞砸了。请看一下:
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);
})
}
答案 0 :(得分:4)
简单地避免for
循环进行异步工作。
对于这类事情,数组有forEach
和map
等功能方法。
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
回调无法再读取启动其承诺的迭代值。