【问题标题】:Loopback support for async/await对异步/等待的环回支持
【发布时间】:2018-10-11 21:09:47
【问题描述】:

我正在使用 loopback 3 构建 REST 服务,并且我想使用 async/await 而不必使用回调。所以不要这样做:

MyModel.myFunction = (callback) => {
  MyModel.find({where: {id: 2}}, (e, data) => {
    if (e) return callback(e);
    callback(null, data);
  });
};

我更愿意这样做:

MyModel.myFunction = async (callback) => {
  try {
    const data = await MyModel.find({where: {id: 2}});
    callback(null, data);
  } catch (e) {
    console.error(e);
    callback(e);
  }
};

回调方法完美运行 - 但 async/await 会产生许多错误:

  • UnhandledPromiseRejectionWarning: Error: Callback was already called.
  • UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().

怎么了?我无法解决这个问题。

【问题讨论】:

  • 您真的要忽略错误(如您的原始代码中的错误)吗?
  • 不要将 promise 与回调样式混合。如您所见,结果并不好 - 您没有正确处理 callback 抛出的情况。
  • 那是你的实际代码吗?我将其复制粘贴(并添加了一个花括号)到server.js 中,刚刚试了一下,它没有抛出任何错误。
  • 当然,我想在第一种情况下处理错误。这是实际代码,它会为我抛出错误,它位于 mymodel.js 文件中(作为附加的远程端点)。
  • 如果您使用异步函数,则不需要使用回调,只需返回结果,只需从函数参数中删除回调,而不是调用回调,只需返回结果。

标签: javascript node.js ecmascript-6 async-await loopbackjs


【解决方案1】:

一些重构:

MyModel.myFunction = async () => {
  try {
    const data = await MyModel.find({where: {id: 2}});
    return data; // it's enough as the async means it returns a promise
  } catch (e) {
    console.error(e);
    throw e;
  }
};

如果您不需要记录错误(环回错误处理程序会记录它而不是您):

MyModel.myFunction = async () => {
  return MyModel.find({where: {id: 2}});
};

【讨论】:

    【解决方案2】:

    看起来我只是混合了两个概念,这就是解决方案:

    MyModel.myFunction = async (callback) => {
      try {
        const data = await MyModel.find({where: {id: 2}});
        return Promise.resolve(data);
      } catch (e) {
        console.error(e);
        return Promise.reject(e);
      }
    };
    

    【讨论】:

    • 同时删除callback 参数。您可以简化为return datathrow e
    【解决方案3】:

    一种更简单的方法是只使用一个函数来解决你的承诺,然后将 db 查询传递给它,就像这样。

    async function ReturnWithResolvedPromise(dbQuery) {
    try {
        return Promise.resolve(dbQuery);
    } catch (e) {
        return Promise.reject(e);
    }}
    

    然后这样称呼它

    let result =    await ReturnWithResolvedPromise(await Users.count({where: {Region: 'UK'}}));
    

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2020-03-13
      相关资源
      最近更新 更多