правильный способ обработки ошибок внутри Promise - PullRequest
0 голосов
/ 16 декабря 2018

В настоящее время я пытаюсь решить, какой шаблон следует использовать при работе с ошибками в Promise.Например, у меня есть код ниже

promiseFunc()
.then(result => {

    console.info(`.THEN:: ${result}`)
})
.catch(error => {

    console.info(`.CATCH:: ${error}`)
})

function promiseFunc() {

    return new Promise((resolve, reject) => {

        setTimeout(() => {

            throw Error("setTimeout's callback error")
            resolve('resolution')           
        }, 1000)
    })
}

Чего я не могу получить, так это того, какой подход следует использовать, чтобы отклонить Обещание, если функция внутри него (в моем случае, setTimeout ()) выдает ошибку,Другими словами, мне нужно отклонение вместо ошибки, но единственная идея, которая приходит мне в голову, - это добавить блок try / catch и отклонить Promise от catch.

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Resolve, Reject и Error - три разные вещи, и ваш код должен обрабатывать случаи, когда вам нужно разрешить и когда вам нужно отклонить его.Если требуемое условие полностью заполнено, то вы вызываете метод разрешения, при этом условие не может быть заполнено, а затем вызывается метод reject ().

В случае каких-либо ошибок, вызванных вашим кодом или по любой другой причине, будет выполнен единственный блок catch () в конце цепочки.

// doAsyncOperation1() returns a promise.
doAsyncOperation1()
.then(() => {
  // ...
  // doAnotherAsyncOperation() returns a promise
  // which will be inserted into the chain.
  return doAsyncOperation2();
})
.then((output) => {
  // output will be the value resolved by the
  // promise which was returned from doAsyncOperation2()
  // ...
  return doAsyncOperation3();
})
.catch((err) => {
  // Handle any error that occurred in any of the previous
  // promises in the chain.
});
0 голосов
/ 16 декабря 2018

Какой подход следует использовать для отклонения Обещания, если функция внутри него (в моем случае, setTimeout ()) выдает ошибку

Асинхронный обратный вызов никогда не должен вызывать исключение.Ваша функция, которую вы пытаетесь обещать (setTimeout), либо генерирует синхронное исключение (которое обрабатывает new Promise), либо вызывает обратный вызов.В обратном вызове вы должны позвонить resolve или reject и сделать это без исключения.

Если вы хотите сделать дополнительные действия в обратном вызове (помимо вызова resolve / reject),вещи, которые могут вызвать исключение: не !

new Promise должен заключать в себе только непосредственную функцию, которую вы хотите обещать, и ничего больше.Делайте больше вещей в then обратных вызовах, которые связаны с обещанием - then будет прекрасно обрабатывать исключения в своем обратном вызове:

function promiseFunc() {
  return new Promise(resolve => {
    setTimeout(resolve, 1000);
//             ^^^^^^^ nothing can go wrong in here
  }).then(() => {
    throw "setTimeout's callback error";
//  ^^^^^ here, it will lead to a rejection
    return "resolution";
  });
}
0 голосов
/ 16 декабря 2018

Вы выдаваете ошибку в асинхронной функции вместо отклонения обещания.

Измените throw Error("") на reject(""):

promiseFunc()
  .then(result => {
    console.info(`.THEN:: ${result}`)
  })
  .catch(error => {
    console.info(`.CATCH:: ${error}`)
  })

function promiseFunc() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      reject("setTimeout's callback error")
      resolve('resolution')
    }, 1000)
  })
}

Или добавьте оператор try-catchи отклонить его в блоке catch

setTimeout(() => {
  try {
    throw new Error("setTimeout's callback error")
  } catch(error) {
    reject(error)
  }
  resolve('resolution')
}, 1000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...