我想在一个循环中按顺序绑定(bind) promise 。我需要这个用户帐户,其中一个操作的结果取决于另一个。 我正在尝试编写一个平面版本 - 所有代码都在一个地方,使用绑定(bind)。这至少是我想要的。我围绕两个创建方法包装了 promises,如下所示:
function create(myApi, record) {
return new Promise(function (resolve, reject) {
myApi.create(record, function (err, result) {
if (err) reject(err);
else resolve(result);
});
});
}
function createUser(myApi, record) {
return new Promise(function (resolve, reject) {
myApi.createUser(record, function (err, result) {
if (err) reject(err);
else resolve(result);
});
});
}
现在,我想在一个循环中创建用户:
for ( var i = 0; i < dummyData.accounts.length; i++) {
var cursorUser = dummyData.accounts[i];
var auth0User = {
email: cursorUser.email,
password: cursorUser.password,
connection: 'Username-Password-Authentication'
};
createUser(api, auth0User)
.then( function(auth0Info) {
console.log("Auth0 userInfo: ", auth0Info);
cursorUser.authProfile = auth0Info;
create(accountsAPIService, cursorUser)
.then(function (account) {
console.log("created account:", account);
})
.catch(function (err) {
console.log('count not create account for user, error: ', err, '\nfor: ', auth0User);
});
})
.catch(function (err) {
console.log('could not create auth0 user, error: ', err, '\nfor: ', auth0User);
});
}
既然这两个方法是异步的,当然是不能正常工作的。调用不是按顺序执行的。我想链接 promise ,以便 create 在 createUser 返回调用之前不会运行。尝试使用绑定(bind),但它对我不起作用。应该如何进行顺序链接?我在 createUser 的 .then 上绑定(bind)?请指教。
最佳答案
当您从 then
返回一个 promise 时,链接在其后的 then
将解决/拒绝该 promise 而不是原始 promise。
createUser(api, auth0User).then(function(auth0Info) {
cursorUser.authProfile = auth0Info;
// Return create's promise
return create(accountsAPIService, cursorUser);
}, function (err) {
console.log('could not create auth0 user, error: ', err, '\nfor: ', auth0User);
})
// This will wait for create's promise instead of createUser's promise
.then(function (account) {
console.log("created account:", account);
}, function (err) {
console.log('count not create account for user, error: ', err, '\nfor: ', auth0User);
})
关于javascript - 正确链接 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34592746/