Влияет ли возвращаемое значение обратного вызова .then () на исходное обещание каким-либо образом? - PullRequest
0 голосов
/ 29 сентября 2018

Я читаю книгу с именем Вы не знаете JS .Я нахожусь в той части, где автор объясняет, почему ошибки в обратном вызове promise.then() не предназначены для обнаружения в обратном вызове ошибок в том же promise.then().Другими словами:

 somePromise.then(
        function success(msg){
            throw new Error()//Line A
        },
        function error(err){
            //error at Line A will not be caught here
        }
    );

Вот фактический контент из книги:

var p = new Promise( function(resolve,reject){
    resolve( 42 );
} );

p.then(
    function fulfilled(msg){
        foo.bar(); //Line C: will throw error because foo is null
        console.log( msg ); // never gets here :(
    },
    function rejected(err){//Line D
        // never gets here either :(
    }
);

Почему он не может просто вызвать обработчик ошибок, который мы там определили ( он говорит о обратном вызове на линии D )?Похоже, логическое поведение на поверхности.Но это нарушило бы фундаментальный принцип, согласно которому Обещания являются неизменными после их решения.Значение p уже выполнено до значения 42, поэтому его нельзя изменить на отклонение только из-за ошибки в наблюдении разрешения p.

У меня проблема с этой строкой:

p уже выполнено до значения 42, поэтому его нельзя впоследствии изменить на отклонение только из-за ошибки в наблюдении разрешения p.

IMO, даже если бы ошибка в строке C была бы рассчитана на попадание в строку D, она не оказала бы никакого влияния на первоначальное обещание (p).Просто потому, что .then() вернет новое обещание , которое никак не связано с первоначальным обещанием.Автор, кажется, думает иначе.ИМХО, что они должны были сказать вместо этого:

Когда выдается ошибка в строке C, создается новое, отклоненное Promise, поэтому его нельзя передать обратному вызову в строке D, поскольку отклонено Promise является неизменным Promise.

Я что-то здесь упускаю?

Источник контента: ссылка

1 Ответ

0 голосов
/ 29 сентября 2018

Это сбивает с толку.Я думаю, что мысль, которую автор пытается сделать, выглядит следующим образом:

  1. rejected выполняется тогда и только тогда, когда p отклонено
  2. , если исключение в строке C былочтобы вызвать обработчик rejected, он должен был бы отклонить p, чтобы сделать это
  3. , поскольку p является неизменным и не может быть отклонен из обработчика then, это следует за этой строкойC не может вызвать этот вызов

Это немного похоже на циклическое рассуждение, потому что # 1 также следует из нашего вывода, что строка C не вызывает выполнение rejected.Нам нужно только принять # 1 в качестве разумного выбора дизайна.

Но да, ваше понимание вопроса совершенно нормально .

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