Синхронно вызывать запросы на выборку, используя промисы

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

//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())
    }
  })
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

мой прекрасный асинхронный для каждого

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))

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

traktor 03.04.2023 13:39

@traktor, ага( забыл про него( мой первый вариант отлично работает с очередью

Kateryna S 03.04.2023 13:45

Согласитесь, async функции и await будут обычным методом кодирования для косвенного вызова обработки промисов. Мне нравится аргумент callback, поскольку он решает проблему, от которой страдает опубликованный код, от которой OP, возможно, еще не рассмотрел.

traktor 03.04.2023 13:52

Другие вопросы по теме