SetTimeout для промисов внутри цикла for

Я хочу сделать следующее:

Зациклиться на наборе данных, для каждого элемента данных сделать вызов API, дождаться, пока обещание не будет выполнено или разрешено, сделать паузу на 30 секунд... затем повторить это снова для следующего элемента данных, пока не будет ничего для повторения в коллекция ..., наконец, отобразить сообщение «Готово».

Пока это код, который я написал, собирая идеи в других вопросах SO, и это не работает так, как мне хотелось бы.

populateDB();

// these 2 helper functions were found on SO

function timeout(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function sleep(fn, ...args) {
  await timeout(30000);
  return fn(...args);
}

// this is the main function that makes the api calls
function populateDB() {

  for (let stock of universe.universe) {
    sleep(() => {
      // actual API call
      return alpha.data
        .daily(stock)
        .then(data => {
          // write data to the db when promise resolves
          db.get("stocks")
            .push({ [stock]: polishData(data) })
            .write();
        })
        .catch(err => console.info(err));
    });
  }

  console.info("Done!");
}

Все обещанное до сих пор цепляется одно за другим нет паузы. Я не думаю, что понимаю промисы достаточно, чтобы отладить это... какой код будет работать так, как я хотел бы?

async function populateDB и await sleep(() => {
Jaromanda X 31.03.2019 06:07

большое спасибо, это было @JaromandaX. Хотите написать ответ?

Yannick 31.03.2019 06:11
Поведение ключевого слова "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) для оценки ваших знаний,...
4
2
413
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Используйте async/await в своей функции populateDB:

async function populateDB() {

  for (let stock of universe.universe) {
    await sleep(() => {
      // actual API call
      return alpha.data
        .daily(stock)
        .then(data => {
          // write data to the db when promise resolves
          db.get("stocks")
            .push({ [stock]: polishData(data) })
            .write();
        })
        .catch(err => console.info(err));
    });
  }
  console.info("Done!");
}

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