Я только что пришел с любопытством обещаний. Если я откажусь непосредственно в цепочке, я могу поймать переменную позже.

Если я отклоняю переменную, я не могу поймать вообще. Обещание всегда считается выполненным в этом случае:

let proMISS = Promise.resolve();
proMISS.then(() => console.log('THEN 1'))
       .then(() => Promise.reject())
       .then(() => console.log('THEN 2'));

setTimeout(() => {
    proMISS.catch(() => console.log('CATCH'));
}, 1000);

Это действительно работает:

let PROmiss = Promise.resolve()
                     .then(() => console.log('THEN 1'))
                     .then(() => Promise.reject())
                     .then(() => console.log('THEN 2'));

setTimeout(() => {
    PROmiss.catch(() => console.log('CATCH'));
}, 1000);

Это не кажется детерминированным

0
Root-Core 29 Авг 2017 в 15:43

3 ответа

Лучший ответ

Я только что нашел ответ, я думаю.

Обещание в переменной разрешено, но цепочка - нет. Поэтому, если вы поймаете переменную, она должна быть решена.

Вам нужно будет сохранить последнего члена цепочки каждый раз, когда вы добавляете участника.

1
Root-Core 29 Авг 2017 в 12:48
let proMISS = Promise.resolve();
let promissTwo = proMISS.then(() => console.log('THEN 1'))
       .then(() => Promise.reject())
       .then(() => console.log('THEN 2'));

setTimeout(() => {
    promissTwo.catch(() => console.log('CATCH'));
}, 1000);
proMISS promissTwo

Ваш второй пример работает на основе той же концепции.

0
Md Eftakhairul Islam 6 Сен 2017 в 04:55

Вы по сути дела

let promise1 = Promise.resolve();
let promise2 = promise1.then(() => console.log('THEN 1'))
       .then(() => Promise.reject())
       .then(() => console.log('THEN 2'));
setTimeout(() => {
    promise1.catch(() => console.log('CATCH'));
    promise2.catch(() => console.log('CATCH'));
}, 1000);

Да, promise1 отличается от promise2. Первый выполняется с undefined, а второй отклоняется.

1
Bergi 29 Авг 2017 в 12:49