Необработанная ошибка отказа - почему? // Обещание Цепочки Решения? - PullRequest
0 голосов
/ 15 октября 2019

A) См. Пожалуйста код ниже.
Если я использую строку // 1, я получаю вызванный метод onError, это нормально.
Но если я использую строку // 2 (и закомментирую // 1), тогда onError все еще вызывается, но есть и необработанная ошибка отклонения. Почему? Это заставляет меня делать цепочки, как в // 1. Если я не делаю цепочку, а звоню catch по первоначальному обещанию, тогда я получаю unhandled rejection error.

B) Почему звонки p.then и p.catch не возвращают исходное обещание p? Я нахожу это странным. Во всех библиотеках, которые я видел, чтобы разрешить цепочку, возвращается оригинальный объект (т.е. объект this). В JavaScript, когда мы делаем promise1.then(...), возвращается новый promise2, который не является promise1. Я нахожу это странным. Что логическое обоснование этого? Для меня это кажется ненужным осложнением и даже плохой практикой. Еще один gotcha, который нужно помнить при работе с JavaScript. Но хорошо ... Я уверен, что умные люди решили использовать этот подход, так что ... в чем причина этого решения? Есть идеи?

    function onSuccess () {
      console.log('Success occurred!')
    }

    function onError () {
      console.log('Error occurred!')
    }

    const promise = new Promise((resolve, reject) => {
      setTimeout(() => {
        reject()
      }, 2000)
    })

    var p1 = promise.then(onSuccess);

    var p2 = p1.catch(onError); // 1 //
    // var p2 = promise.catch(onError); // 2 //

    console.log("DONE!");

1 Ответ

2 голосов
/ 15 октября 2019

Чтобы ответить на ваш первый вопрос, это довольно просто:

У вас есть 2 объекта обещания, когда вы дойдете до тех строк, которые вы упомянули: одна удерживается переменной promise, а другая - p1переменная. Когда вы связываете catch непосредственно с promise, это не относится к обещанию, которое возвращается из цепочки then - которая хранится в p1 - поэтому вы получаете unhandled promise rejection error на обещание, которое возвращается из предложения then .

Но, когда вы связываете его с p1, который уже связан с promise, тогда предложение catch охватывает их обоих так,здесь нет ошибок.

Разница, в сущности, заключается в том, что строка // 1 может отлавливать отклонения / ошибки как из исходного обещания, так и из обещания .then, но строка // 2 захватывает только отклонения от исходного обещания, оставляя отклоненияиз .then необработано.

О 2-м вопросе Извините, но слишком высокий уровень для меня, и я не хочу давать неполный / неточный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...