try / catch vs then() / catch() for [err, result] = await pr



这可能是重复的,但我还没有找到答案。

我希望表达式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(...));

编辑2020:

这就是我现在的工作方式。我使用的是helper函数,而不是库。

//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中,并将其分配给元组(此处为两个项的数组(,即可根据具体情况获得errresult

旧答案:

我认为您不需要使用任何库来编写可读的、看起来同步的异步代码。我一直在使用没有try/catch块的异步等待,方法如下-

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

只要多加一行,就可以避免使用外部库和将代码封装在不必要的函数中。

但是,如果你必须使用其中一个片段,那么第一个要好得多,因为try/catch块确实会降低性能。

最新更新