Я хотел бы вызвать выборку для каждого элемента в массиве, но я хотел бы делать их по одному, начиная новый только после завершения предыдущего. Есть ли способ решить эту проблему, используя только промисы? Я решил это с помощью рекурсии, но я думаю, что мое решение немного глупо. Мое решение заключается в следующем:
//call fetch once for each word in the array
let promises = "words to fetch from this array".split(' ')
fetchCall(promises.shift())
function fetchCall(word) {
return new Promise(function(resolve, reject) {
console.info('this is simulating a fetch call')
setTimeout(function() {
return resolve('resolved')
}, 1000)
}).then(function() {
//only make the next fetch call when the previous one has finished
if (promises.length > 0) {
fetchCall(promises.shift())
}
})
}
мой прекрасный асинхронный для каждого
async function asyncForEach(array, promiseFn) {
for (let index = 0; index < array.length; index++) {
await promiseFn(array[index], index, array)
}
}
//call fetch once for each word in the array
let promises = "words to fetch from this array".split(' ')
Затем вызовите asyncForEach
для вашего массива
await asyncForEach(promises, item => {
// add async to simulate delay from xhr request
return new Promise( async function(resolve, reject){
console.info('this is simulating a fetch call')
await setTimeout(function(){
return resolve('resolved')
}, 1000)
}).then(function(){
// print item after promise resolve
console.info(item);
})
})
ИЛИ Вы можете использовать Promise.all
//call fetch once for each word in the array
let promises = "words to fetch from this array".split(' ')
let promisesArr = promises.map(e => new Promise((resolve, reject) => {
setTimeout(function(){
console.info('this is simulating a fetch call', e)
resolve(e)
}, 1000)
}))
// res is array or resolve arguments
Promise.all(promisesArr).then(res => console.info(res))
@traktor, ага( забыл про него( мой первый вариант отлично работает с очередью
Согласитесь, async
функции и await
будут обычным методом кодирования для косвенного вызова обработки промисов. Мне нравится аргумент callback
, поскольку он решает проблему, от которой страдает опубликованный код, от которой OP, возможно, еще не рассмотрел.
К сожалению,
promise.all
выполняет операции выборки параллельно, а вопрос заключается в том, как выполнять их последовательно, одну за другой.