不能使用诺言

时间:2017-01-22 18:27:50

标签: javascript node.js promise

我试图在节点中使用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');
    });
}

2 个答案:

答案 0 :(得分:1)

它并不是100%清楚你要问的是什么,但你可以解决几个错误:

  1. 要让调用者知道内部承诺何时完成,您必须返回该承诺。所以,将return添加到return Model.update(...)`

  2. resolve()不是全局可用的函数,因此尝试从.then()处理程序中调用它没有意义。实际上,这可能会导致抛出异常,因为resolve未定义。

  3. 当您在.then()处理程序中时,原始承诺已经解决。你不需要解决任何问题。要将值作为父承诺的已解析值返回,只需返回该值。

  4. 当您从.catch()处理程序中进行日志记录时,如果您希望主机承诺保持拒绝,则必须重新抛出错误。否则,错误变为"处理"并且承诺变为已解决。

  5. 然后,在你的第二个代码块中,将async库与promises混合起来真的没有意义。它们是管理异步操作的不同方法。选择一个或另一个方案 - 不要混合。如果您已经有了这样的承诺,那么您可以返回该承诺并让调用者使用承诺。当你已经有了承诺时,不需要async库。

  6. 您可以修复以下内容:

    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(...)