2016-04-27 4 views
1

Код:Promise, не дожидаясь, чтобы решить, прежде чем следующий затем

var x = new Promise((resolve, reject) => { 
    setTimeout(function() { 
     console.log('x done'); 
     resolve() 
    }, 1000); 
}); 


Promise.resolve().then(x).then((resolve, reject) => { 
    console.log('all done'); 
}); 

Выход:

all done 
x done 

Ожидаемый результат:

x done 
all done 

Почему обещание x не дожидаясь разрешения перед вызовом следующего then callback?

JSFiddle: https://jsfiddle.net/puhbqtu0/1/

+0

'then' ожидает функцию как своего аргумента, а не обещание. – Bergi

+0

, потому что 'then()' нуждается в функции в качестве аргумента, а не в обещании. Итак, следующий 'then' выполняется после того, как x запущен, а не разрешен. –

+1

Вы должны вернуть 'x' в' then': 'then (() => x)'. – alexmac

ответ

4

Так как вы хотите запустить обещания в серии вы должны преобразовать x функционировать и вызвать его в then:

function x() { 
    return new Promise(resolve => { 
    setTimeout(() => { 
     console.log('x done'); 
     resolve() 
    }, 1000); 
    }); 
}); 

Promise.resolve() 
    .then(x) 
    .then(() => console.log('all done')); 

или простейший вариант:

x().then(() => console.log('all done')); 

jsfiddle demo

+0

Скорее всего, это антипаттерн, который может закончиться необработанными отказами. Вы не должны вводить обещания в такую ​​цепочку. – Bergi

+0

@Bergi - что вы предлагаете для выполнения обещаний в серии? – HyderA

+0

@ Берги, пожалуйста, уточните, почему это плохо. – alexmac

Смежные вопросы