try / catch vs then () / catch () для [err, result] = ожидание обещания - PullRequest
0 голосов
/ 02 ноября 2018

Возможно, это дубликат, но я пока не нашел ответа.

Я хочу, чтобы выражение 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 голосов
/ 03 ноября 2018

Я думаю, вам не нужно использовать какую-либо из библиотек для написания читаемого, синхронно выглядящего асинхронного кода. Я использовал async-await без блоков 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 замедляют работу.

...