Как избежать попыток / поймать ад в javascript?

Хорошо, мне нравится (d) try / catch с await / async.

Но что мне с этим делать.

Я хотел это сделать ..

let a = await doAbc();
let b = await do123(a);

вместо этого он становится

let a, b;

try {
   a = await doAbc();
} catch(e) {
   a = await doZxc();
}

try { 
   b = await do123(a);
} catch (e) {
   console.log(e);
   return;
}

if (b.data == undefined) {
    return -1;
} else {
    return b;
}

На данный момент я сожалею обо всем.

почему вы перестали использовать ожидание?

Bravo 26.10.2018 04:14

Вы используете Обещания.

Obsidian Age 26.10.2018 04:14

Я использую await, async и, следовательно, обещания, я не писал их ради псевдокода

Muhammad Umer 26.10.2018 04:19

как вы думаете, doAbc .catch(doZxc) .then(d123) .then(b => b.data === undefined ? -1 : b, e => { console.log(e); return; }); легче читать?

Bravo 26.10.2018 04:20

Я чувствую, что в некоторых ситуациях объединение обещаний в цепочку на самом деле легче читать.

Muhammad Umer 26.10.2018 04:21

Используйте then () в своем первом блоке try, чтобы добавить второй try / catch

Osama 26.10.2018 04:23

@MuhammadUmer - всегда используйте правильный инструмент для работы: p

Bravo 26.10.2018 04:24
7
7
1 572
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если это все в одной логической функции, вы можете сгруппировать все свои await за одну попытку, а затем предпринять действия в случае ошибки.

let a
let b
try {
  a = await doAbc();
  b = await do123(a);
} catch (err) {
  // take appropriate action based on err
}

Итак, я использую это в контексте expressjs. Есть ли хороший шаблон для обработки ошибок и всех случаев на самых верхних уровнях. Некоторые ошибки возникают из-за того, что вы хотите попробовать разные вещи, а некоторые ошибки таковы, что пользователям нужно извиниться, что это невозможно или что-то не так.

Muhammad Umer 26.10.2018 04:23

за исключением того, что ошибка в doAbc должна привести к a = await doZxc(); - так близко, но так далеко от исходного кода

Bravo 26.10.2018 04:23

Create to function first return a and second using the first function return value to create b, что-то вроде этого кода

function firstCode(){
    try {
       a = await doAbc();
    } catch(e) {
       a = await doZxc();
      }
    return a;
}
function secondFunction(){
try { 
   b = await do123(firstFunction());
} catch (e) {
   console.log(e);
   return;
}
}
Ответ принят как подходящий

Помните, что вы можете await любое обещание. Итак, вы могли:

let a = await doAbc().catch(doZxc); // or .catch(() => doZxc())
let b = await do123(a);

Или даже

 let b = await doAbc().catch(doZxc).then(do123);

Вместе с остальной частью вашего кода:

try { 
  let b = await doAbc().catch(doZxc).then(do123);
  return b.data == undefined ? -1 : b;
} catch (e) {
   console.log(e);
   return;
}

Другие вопросы по теме