Я читаю книгу с именем Вы не знаете 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
.
Я что-то здесь упускаю?
Источник контента: ссылка