【问题标题】:Not being able to use promise无法使用承诺
【发布时间】:2017-06-07 06:29:25
【问题描述】:

我正在尝试在节点中使用 Promise。

但是,then 部分没有被执行。 第一个函数返回一个 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');
    });
}

【问题讨论】:

  • The first function returns a resolve() instance 什么是解析实例?
  • 这只是解决('成功');行
  • 但是resolve 是什么?它没有特殊的内置含义,也没有在您的代码中定义
  • 我只是在关注这个:davidwalsh.name/promises 它使用了 resolve('Success!');在其中一个例子中
  • Resolve 在该示例中是一个回调,它告诉承诺,好吧,解决。它不是全局变量。您的示例将引发异常。

标签: javascript node.js promise


【解决方案1】:

您需要返回您的承诺才能使用then

return Model.update(...)

【讨论】:

  • 我添加了返回模型,但仍然没有任何反应。
  • 每次你使用一个promise你需要返回它以便调用函数可以等待它,因为你显示的代码它应该可以工作,也许你没有显示的代码有问题
  • 我编辑了代码。我在 async.map 函数中调用该函数。因为我想为我的数据库的每个元素并行运行某个进程(refresh_access_token 函数),然后仅在 refresh_access_token 完成时才执行另一个进程@user3
【解决方案2】:

您的要求不是 100% 清楚,但您可以修复几个错误:

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

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

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

  4. 当您从 .catch() 处理程序中登录时,如果您希望主机承诺保持被拒绝,您必须重新抛出错误。否则,错误将变为“已处理”并且承诺更改为已解决。

  5. 然后,在您的第二个代码块中,将 async 库与 Promise 混合在一起确实没有意义。它们是管理异步操作的不同方法。选择一个方案或另一个 - 不要混用。如果你已经有一个像你一样的 Promise,那么你可以返回那个 Promise 并让调用者使用这个 Promise。如果你已经有了 Promise,就不需要 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;
    });

    ...

}

【讨论】:

  • 感谢您的帮助,但仍然无法正常工作。我想以并行方式为我的数据库的每个元素运行一个特定进程(refresh_access_token 函数),然后仅在 refresh_access_token 完成时才执行另一个进程
  • @FilipeFerminiano - 当您只包含这么多代码并且您没有详细说明问题出在哪里时(例如,解释您的调试和故障排除方式),我们可以帮助您解决更大的问题的方法为零'已经完成)。您刚刚描述了一大堆与您问题中的代码完全无关的东西。我们正在尽我们所能使用您显示的代码和您提供的描述。哎呀,我已经给了你四件事来修复这么多的代码。除了我们必须要做的事情之外,我们无能为力。
  • 好的,谢谢您的回答。我想帮你解决我的问题。但我对 Promises 知之甚少,无法做到这一点。我只知道代码没有按我的预期工作。我将对此进行更多研究,并检查我是否走在正确的道路上。我接受您的回答,以表示感谢您的帮助。
  • 是的,对不起,会消除噪音:p
猜你喜欢
  • 1970-01-01
  • 2020-02-18
  • 2019-11-05
  • 1970-01-01
  • 2020-09-21
  • 2016-07-27
  • 2020-06-23
  • 2019-04-19
  • 1970-01-01
相关资源
最近更新 更多