Ответ, по-видимому, заключается в том, что вы - возможно по ошибке - создали два обещания (поскольку .then
создает новый объект обещания на основе предыдущего, см. MDN ).Посмотрите на комментарии ниже:
test(): Promise<void> {
// this creates the base promise "A"
let promise = new Promise((resolve, reject) => {
resolve();
});
// this creates promise "A1" by adding a chain of operations to "A"
// you are not returning it however
promise
.then(()=>console.log("then11"))
.then(()=>console.log("then12"))
.then(()=>this.simulateHeavyStuff(2000))
.then(()=>console.log("then14"))
.catch(console.error)
// this returns "A" (not "A1")
return promise;
}
// this creates promise "A2"
t.test()
.then(()=>console.log("then2"))
.then(()=>console.log("then21"))
.catch(console.error)
Когда вы запустите фрагмент кода, вы увидите, что обработка обоих обещаний, кажется, выполняется полностью детерминистически по принципу round-robin (это означает, что обещания выполняются по очереди для каждого шага операции .then
).Последовательность
«А1» -> «А2» -> «А1» ...
class Test {
simulateHeavyStuff(time){
// console.log("-"+time+"-");
var start = new Date().getTime();
var end = start;
while(end < start + time) {
end = new Date().getTime();
}
console.log('then13 (heavy stuff)');
}
test() {
let promise = new Promise((resolve, reject) => {
resolve();
});
// ##### ADDING CHAIN 1 #####
promise
.then(()=>console.log("then11"))
.then(()=>console.log("then12"))
.then(()=>this.simulateHeavyStuff(2000))
.then(()=>console.log("then14"))
.catch(console.error)
return promise;
}
}
let t = new Test();
// ##### ADDING CHAIN 2 #####
t.test()
.then(()=>console.log('then21'))
.then(()=>console.log('then22'))
.then(()=>console.log('then23'))
.catch(console.error)
В вашем случае - когда все шаги выполнения полностью синхронизированы - программа выполняется детерминистически: т. Е. i -ая цепочка .then
операция обещания «А1» предшествует i -ой цепочке .then
операции «А2»;и i + 1 операция обещания "A1" следует за i -й цепочкой .then
операция обещания "A2".
Спецификация ECMA Script 2015 , кажется, подтверждает это поведение, поскольку .then
пулы должны стоять в очереди в очереди заданий.