Есть ли способ гарантировать, что "Promise.all" решает после "тогда" цепи внутреннего обещания?

Вопрос:

Есть ли способ гарантировать, что Promise.all решает после then цепочки внутреннего обещания?

Пример:

const promiseOne = new Promise((resolve, reject) => {
setTimeout(function(){
console.log('promiseOne after 1 second')
resolve()
}, 1000)
}).then(()=> {
setTimeout(function(){
console.log('promiseOne then chain, after 2 seconds')
}, 1000)
})


Promise.all([promiseOne])
.then(() => {
console.log('Promise.all then chain after 1 second')
})

Журналы:

promiseOne after 1 second
Promise.all then chain after 1 second
promiseOne then chain, after 2 seconds

Лучший ответ:

then они работают в правильном порядке, но первый из них просто устанавливает тайм-аут, поэтому console.log выполняется в обратном порядке до тех then. Если вы хотите, чтобы ждать, что тайм — аут, чтобы работать, прежде чем продолжить цепочку, необходимо использовать дополнительный посыл возвращенного от then:

const promiseOne = new Promise((resolve, reject) => {
  setTimeout(function(){
    console.log('promiseOne after 1 second')
    resolve()
  }, 1000)
}).then(() => new Promise((resolve, reject) => {
  setTimeout(function(){
    console.log('promiseOne then chain, after 2 seconds')
    resolve()
  }, 1000)
  })
)


Promise.all([promiseOne])
.then(() => {
  console.log('Promise.all then chain after 1 second')
})
Ответ №1

Самый простой способ передать обещание, возвращенное последним, then, что вы уже делаете. Если вы берете свой консольный журнал первым, а then из setTimeout вы увидите, что он выполняется в том порядке, в котором вы хотите.

Причина, по которой он регистрируется в этом порядке, заключается в том, что setTimeout является асинхронным.

Попробуй так:

const promiseOne = new Promise((resolve, reject) => {
setTimeout(function(){
console.log('promiseOne after 1 second')
resolve()
}, 1000)
}).then(()=> new Promise(resolve => {
setTimeout(function(){
console.log('promiseOne then chain, after 2 seconds')
resolve()
}, 1000)
})

Первым, а then вернем обещание, он будет ждать до вашего setTimeout и продолжить в правильном порядке.

EDIT: в качестве бонуса при использовании setTimeout s этот помощник очень полезен:

const wait = ms => () => new Promise(resolve => setTimeout(resolve,ms));

Что вы можете использовать так:

Promise.resolve()
.then(wait(2000))
.then(() => {
doSomething();
})

Ответ №2

Вы должны вернуть новое обещание в цепочке внутреннего обещания:

const promiseOne = new Promise((resolve, reject) => {
setTimeout(function(){
console.log('promiseOne after 1 second')
resolve();
}, 1000)
}).then(()=> {
return new Promise((resolve, reject) => {
setTimeout(function(){
console.log('promiseOne then chain, after 2 seconds');
resolve();
}, 1000)
});
})

Promise.all([promiseOne])
.then(() => {
console.log('Promise.all then chain after 1 second')
})

Оцените статью
TechArks.Ru
Добавить комментарий