setTimeout для обещаний внутри цикла for - PullRequest
2 голосов
/ 31 марта 2019

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

Цикл по коллекции данных, для каждого элемента данных сделать вызов 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!");
}

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

1 Ответ

3 голосов
/ 31 марта 2019

Используйте 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!");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...