对async/await的环回支持

khe*_*nik 6 javascript node.js async-await ecmascript-6 loopbackjs

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

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

我更喜欢这样做:

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

回调方法完美无缺 - 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().

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

Max*_*rai 9

一些重构:

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;
  }
};
Run Code Online (Sandbox Code Playgroud)

如果您不需要记录错误(环回错误处理程序将其记录而不是您),以防万一:

MyModel.myFunction = async () => {
  return MyModel.find({where: {id: 2}});
};
Run Code Online (Sandbox Code Playgroud)


khe*_*nik 1

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

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);
  }
};
Run Code Online (Sandbox Code Playgroud)

  • 还要删除“callback”参数。您可以简化为“返回数据”和“抛出 e”。 (4认同)