Обещание поймать поведение

кажется, что следующее работает без ошибки:

var p = new Promise (function (resolve, reject) {
    window.setTimeout(function() {
        reject('ko');
    }, 1000);
});

p.then(function (value) { console.log(value); })
.catch(function () { console.log('catched'); });
// → 'catched'

Но это выдает ошибку:

var p = new Promise (function (resolve, reject) {
    window.setTimeout(function() {
        p.catch(function () { console.log('catched'); });
        reject('ko');
    }, 1000);
});

p.then(function (value) { console.log(value); });
// → 'catched'
// Uncaught (in promise) ko

Любые дикие догадки, почему?


person clenemt    schedule 02.03.2016    source источник
comment
Это потому, что вы не обработали ошибку в своей цепочке p.then... каждый p.then или p.catch независим, и каждый должен (в конечном итоге) обрабатывать ошибки   -  person Jaromanda X    schedule 02.03.2016


Ответы (1)


.catch должен быть непосредственно связан после .then. Даже если вы напишете это таким образом, он все равно сообщит о неперехваченном:

var p = new Promise(function(resolve, reject) {
  window.setTimeout(function() {
    //p.catch(function () { console.log('catched'); });
    console.log(p)
    reject('ko');
  }, 1000);
});

p.then(function(value) {
  console.log(value);
});
p.catch(function() {
  console.log('catched');
});

Причина этого в том, что если вы не свяжете это таким образом, функция .catch не получит возвращаемое значение, которое генерируется при вызове .then.

person jmcgriz    schedule 02.03.2016
comment
Я понимаю вашу точку зрения, но как бы вы реализовали обработчик ошибок внутри setTimeout() than ? Поскольку нативные промисы не имеют никакого метода done(). Я не уверен, что это возможно. Это, конечно, с учетом того факта, что я даю кому-то Promise и хочу поймать возможные ошибки, которые они делают с ним. - person clenemt; 03.03.2016
comment
Если вам нужна эта функциональность, лучше всего, вероятно, передать им функцию next с запросом обещания. Таким образом, вы получите function createPromise(next){ var p = new Promise(function(resolve, reject){}); p.then(next).catch(function(){ console.log('Error Caught') }) - person jmcgriz; 03.03.2016
comment
Да, но они теряют возможность связывать методы. - person clenemt; 04.03.2016
comment
Я думаю, тогда возникает вопрос о том, кто они такие, похоже, что им, возможно, придется выполнять обработку ошибок на своей стороне. - person jmcgriz; 04.03.2016