setTimeout для обещаний внутри цикла for

#javascript #arrays #object #ecmascript-6 #promise

#javascript #массивы #объект #ecmascript-6 #обещание

Вопрос:

Что я хочу сделать, так это:

Выполните цикл над коллекцией данных, для каждого элемента данных выполните вызов 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.log(err));
    });
  }

  console.log("Done!");
}
  

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

Комментарии:

1. async function populateDB и await sleep(() => {

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

Ответ №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.log(err));
    });
  }
  console.log("Done!");
}