我试图在节点中使用promises。
但是,当时的部分没有被执行。 第一个函数返回resolve()实例。 我该如何解决这个问题?
这是代码:
exports.refresh_access_token = function (environment_hash) {
...
Model.update(values, {where: where}).then(function () {
console.log('updated!');
resolve("Success!");
}).catch(function (err) {
console.log('error on update');
});
...
}
async.map(accounts, function (account) {
module.exports.refresh_access_token(account.environment_hash).then(function () {
console.log('async called back');
});
}
答案 0 :(得分:1)
它并不是100%清楚你要问的是什么,但你可以解决几个错误:
要让调用者知道内部承诺何时完成,您必须返回该承诺。所以,将return
添加到return
Model.update(...)`
resolve()
不是全局可用的函数,因此尝试从.then()
处理程序中调用它没有意义。实际上,这可能会导致抛出异常,因为resolve
未定义。
当您在.then()
处理程序中时,原始承诺已经解决。你不需要解决任何问题。要将值作为父承诺的已解析值返回,只需返回该值。
当您从.catch()
处理程序中进行日志记录时,如果您希望主机承诺保持拒绝,则必须重新抛出错误。否则,错误变为"处理"并且承诺变为已解决。
然后,在你的第二个代码块中,将async
库与promises混合起来真的没有意义。它们是管理异步操作的不同方法。选择一个或另一个方案 - 不要混合。如果您已经有了这样的承诺,那么您可以返回该承诺并让调用者使用承诺。当你已经有了承诺时,不需要async
库。
您可以修复以下内容:
exports.refresh_access_token = function (environment_hash) {
...
return Model.update(values, {where: where}).then(function () {
console.log('updated!');
return "Success!";
}).catch(function (err) {
console.log('error on update');
// after logging, make sure promise stays rejected
throw err;
});
...
}
答案 1 :(得分:0)
您需要回复您的承诺才能使用then
return Model.update(...)