编辑 2020:
这就是我现在的工作方式。我为此使用了辅助函数,而不是库。
//helpers.js
export function until(promiseOrPromiseList) {
if (!promiseOrPromiseList) {
console.error("no promise passed.",promiseOrPromiseList);
return Promise.reject(["Unknown Error"]);
}
//array of promises
if (Array.isArray(promiseOrPromiseList)) {
return Promise.all(promiseOrPromiseList)
.then((data) => {
return [null, data];
})
.catch((err) => {
return [err, promiseOrPromiseList.map((p) => undefined)];
});
}
//single promise call
return promiseOrPromiseList
.then((data) => {
// console.log(data);
return [null, data];
})
.catch((err) => {
// console.log(err)
return [err];
});
}
我的用法是-
import {until} from "../helpers.js";
async function sendUserDetails() {
const [err, user] = await until(getUserFromDb(userId));
if (err) {
errorLog.error(err);
return res.json({success:false,msg:"An Error occured"})
}
res.json({success:true,user:user})
}
因此,您只需将返回 Promise 的函数包装在 until 中,并将其分配给元组(此处为两个项目的数组)以获取 err 和 result(视情况而定)。
旧答案:
我认为您不需要使用任何库来编写可读的、具有同步外观的异步代码。
我一直在使用没有 try/catch 块的 async-await,方法如下 -
//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');
}
//...
或者,如果您想专门使用错误,
//usage
let user,userErr;
user = await getUserFromDb(userId).catch(err=>userErr = err);
if(!user){
console.log(userErr);
}
使用额外的一行,您可以避免使用外部库并将代码包装在不必要的函数中。
但如果您必须使用其中一个 sn-ps,那么第一个会好得多,因为 try/catch 块会降低性能。