这可能是重复的,但是我还没有找到答案。
我希望表达式let result = await promise;
以Node.js样式[err, result]
返回结果。
有两种解决方案。由于我对Node.js / then()/ catch()/ async / await不太熟悉,所以我想知道每种方法的优点/缺点。
第一(https://www.npmjs.com/package/await-to-js):
我在这里找到它:https://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript
function to(promise) {
return promise.then(data => {
return [null, data];
})
.catch(err => [err]);
}
第二:
async function to2(promise) {
try {
return [null, await promise];
} catch (e) {
return [e];
}
}
两者的调用方式相同:let [err, user] = await to/to2(User.create(...));
答案 0 :(得分:0)
我认为您不需要使用任何库来编写可读的,同步外观的异步代码。 我一直在使用没有try / catch块的async-await,方法如下-
>&2
或者,如果您想专门使用错误,
//write a promise
function getUserFromDb(userId){
return new Promise((resolve,reject)=>{
if(userId == undefined){
return reject('no userId specified');//return to stop proceeding further.
}
UserModel.findById(userId,function(err,user){
if(err) return reject('error while fetching user details.')
resolve(user);
});
}
//-------------------
//usage
//remember to use async keyword before function declaration
//...
let user = await getUserFromDb(userId).catch(err=>console.log(err));
//user will be undefined, if the promise was rejected.
if(!user){
console.log('error while getting the details');
}
//...
多一行,可以避免使用外部库并将代码包装在不必要的函数中。
但是如果您必须使用其中的一个片段,则第一个片段要好得多,因为try / catch块确实会降低性能。