首页 > 解决方案 > 为什么此方法中的回调位于 thenable 中,回调不应成为 updateAll 方法返回语句的一部分?

问题描述

根据loopback 的官方文档,方法 updateAll 有 3 个参数:where、data、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 方法的一部分吗?

标签: javascriptnode.jsloopbackjsloopback

解决方案


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

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

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

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

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

  1. 记录的返回值,updateAll看看它是否是一个承诺
  2. 只要坚持文档所说的并使用回调即可。

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


推荐阅读