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().怎么了?我无法解决这个问题.
一些重构:
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)
看起来我只是混合了两个概念,这就是解决方案:
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)