正确链接诺言

我想在循环内依次绑定promise。 我需要这个用户帐户,一个操作的结果取决于另一个。 我正在尝试使用绑定编写一个平面版本 – 所有代码在一个地方。 这至less是我想要的。 我用两个创build方法来包装promise,如下所示:

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); }); }); } 

现在,我想创build一个循环中的用户:

 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); }); } 

由于这两种方法是asynchronous的,所以当然不能正常工作。 调用不会顺序执行。 我想链承诺,以便创build不会运行,直到来自createUser的调用返回。 尝试使用绑定,但它没有为我工作。 这是如何做顺序链接? 我绑定了。然后创build用户? 请指教。

当你从then回来的承诺, then链接后将解决/拒绝承诺,而不是原来的承诺。

 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); }) 

使用ES6,您可以使用生成器,它允许您像asynchronous一样编写asynchronous任务。 在这个例子中,我使用的是蓝鸟,但是有其他很多有效的选项。

 var CreateUserGenerator = BPromise.coroutine(function * (arg) { 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' }; var auth0Info = yield createUser(api, auth0User); console.log("Auth0 userInfo: ", auth0Info); cursorUser.authProfile = auth0Info; var account = yield create(accountsAPIService, cursorUser) console.log("created account:", account); } } function generateorWithCatch (argument) { creatLoopUser(arg) .catch(function (err) { console.log('could not create auth0 user, error: ', err, '\nfor: ', auth0User); }); } 

在这个解决scheme中,我假设您的create和createUser函数被写入并正确返回值