对异步/等待的环回支持



我正在使用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().

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

一些重构:

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}});
};

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

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);
}
};

一种更简单的方法是使用一个函数来解决您的承诺,然后将 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'}}));

最新更新