try / catch vs then()/ catch()for [错误,结果] =等待承诺

时间:2018-11-02 16:54:41

标签: node.js async-await try-catch

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

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

1 个答案:

答案 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块确实会降低性能。