javascript поймать несколько ошибок одним уловом - PullRequest
0 голосов
/ 13 июля 2020

Допустим, у меня есть 3 функции с обещаниями:

function1().then(() => {
  function2().then(() => {
    function3().then(() => {      
    })
  })
}).catch((err) => {
  console.log(err);
})

Смогу ли я отловить ошибку, возвращаемую любой из 3 функций? Если нет, что мне делать, чтобы отловить ошибки, возвращаемые любыми обещаниями функций с помощью одного оператора?

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Вместо того, чтобы вызывать и связывать их в телах, верните полученное обещание и объедините предложения .then.

function1().then(() => {
  // TODO: Something.
  return function2();
}).then(() => { // <-- This `.then` waits until `function2` has finished executing
  // TODO: Something.
  return function3();
}).then(() => { // <-- This `.then` waits until `function3` has finished executing
  // TODO: Something.
}).catch((err) => {
  console.log(err);
});
0 голосов
/ 14 июля 2020

Самое простое изменение - просто return внутренние обещания. Это приведет к тому, что их отклонения распространятся вверх до одиночного .catch(), например:

function1().then(() => {
  return function2().then(() => {
    return function3().then(() => {      
    })
  })
}).catch((err) => {
  console.log(err);
})

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

async someFunction() {
    try {
        let val1 = await function1();
        let val2 = await function2();
        let val3 = await function3();
    } catch(e) {
        // catch any rejections from the above three `await` statements here
        console.log(e);
    }
}

Используя также await значительно упрощает просмотр потока кода и сбор результатов нескольких асинхронных вызовов в одной области.

Без await вы также можете сгладить исходный код:

function1().then(() => {
    return function2().then(() => {
    })
}).then(() => {
    return function3().then(() => {      
    })
}).catch((err) => {
  console.log(err);
})

Но большинство людей сочтут реализацию await более простой.

0 голосов
/ 13 июля 2020

Вы можете использовать async / await или then без вложенности:

function1().then(() => Promise.resolve(val1))
.then(() => Promise.resolve(val2))
 ...
}).catch((err) => {
  console.log(err);
});

С async / await:

try {
    await function1();
    await function2();
    ...
} catch(err) {
    console.log(error);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...