【问题标题】:Why is the callback in this method located in a thenable, shouldn't the callback be part of the updateAll method return statement?为什么此方法中的回调位于 thenable 中,回调不应该是 updateAll 方法返回语句的一部分?
【发布时间】:2019-06-02 16:55:37
【问题描述】:

根据loopback's official docs,方法updateAll有3个参数:where、data、callback,需要callback。

Account.deleteSingleHearingTest = function (req, callback) {
    Account.findById(req.accessToken.userId)
        .then(account => {
            if (!account) {
                throw new Error('Cannot find user');
            }
            return app.models.HearingTest.updateAll({ accountId: account.id, id: req.body.hearingTestId }, { isDeleted: new Date() });

        })
        .then(() => {
            callback(null);
        })
        .catch(error => {
            callback(error);
        });
}

我可以看到前两个参数在那里,但是,回调似乎不是方法调用的一部分。回调不应该是 updateAllll 方法的一部分吗?

【问题讨论】:

  • 也许他们的文档已经过时了。该代码工作吗?
  • 是的,它有效。我正在尝试编写一个新的远程方法,并希望确保我了解它的工作原理/原因
  • 查看他们的文档,他们的一些方法支持可选回调,因为它们返回承诺,如果上面的代码有效,这是他们的文档过时的问题。 请记住,如果 updateAll 没有返回承诺,.then 仍将(在这种情况下错误地)被调用。
  • 如果它有效,那么请注意,除非您 需要 使用这样的回调语法,否则返回 thenable 可能更有意义,以便可以使用它deleteSingleHearingTest(...args).then( ...)
  • 您缺少使用承诺而不是回调的环回文档:loopback.io/doc/en/lb3/Using-promises.html

标签: javascript node.js loopbackjs loopback


【解决方案1】:

我将在回答中详细说明我的评论。我敢打赌你的代码实际上不起作用,你只是认为它起作用。

假设对updateAll 的调用返回了一些东西(即不会抛出错误)——无论是 null、未定义、true 还是其他——那么你的回调将被立即调用并且会实际上并没有等待您的updateAll 执行它的异步操作。现在,如果对 updateAll 的调用速度足够快,那么您可能觉得代码可以正常工作,而实际上却没有。

这可能有助于更好地说明我的意思:

Promise.resolve()
  .then(function() { return undefined; })
  .then(function() { console.log('it worked!'); });

你可以做两件事(不相互依赖):

  1. 记录updateAll的返回值,看看是不是promise
  2. 只要坚持文档所说的并使用回调即可。

就我个人而言,我会先做 1,然后再做 2 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2020-08-27
    • 1970-01-01
    • 2019-08-14
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多