Maximum call stack size exceeded - Как запустить функцию после добавления данных в БД еще раз

const mongoClient = new MongoClient("mongodb://localhost:27017/");
await mongoClient.connect();

const mongoCollection = mongoClient.db(DB).collection(COLLECTION);

let coins = []

//получение данных 
coins.push(coin)

async function addBD(){
  console.log(coins.length)
  coins = removeDuplicates(coins)
  console.log("Без дубликатов ", coins.length)
  for (const coin of coins){
    await mongoCollection.replaceOne({ exchange: coin.exchange,
      symbol: coin.symbol }, coin, {upsert: true});
  }
  coins = []
  console.log(coins.length)
}

setInterval(()=>{
  addBD()
}, 5000)

как сделать, чтобы функция запускалась, после завершенной работы цикла? Без использования интервала.

async function addBD(){
  console.log(coins.length)
  coins = removeDuplicates(coins)
  console.log("Без дубликатов ", coins.length)
  for (const coin of coins){
    await mongoCollection.replaceOne({ exchange: coin.exchange, symbol: coin.symbol }, coin, {upsert: true});
  }
  coins = []
  console.log(coins.length)
  addBD()
}

делал так, но возникает ошибка "Maximum call stack size exceeded"


Ответы (1 шт):

Автор решения: SwaD

Реализовать циклический запуск функции можно следующими способами

Создать функцию обертку, которая будет вызывать нужную функцию и по завершению вызывать себя же. Там же пример, если надо сделать задержку между вызовами

async function sleep(time) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log('call function');
      resolve()
    }, time);
  })
}

async function run(time) {
  await sleep(time)
    .then(() => run(time))
    // .then(() => setTimeout(() => run(1000), 100)) // Если нужна задержка между вызовами
}

run(1000);

Либо через цикл while, так же в асинхронной функции, что бы можно было дожидаться результата:

async function sleep(time) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log('call function');
      resolve()
    }, time);
  })
}
// Флаг для возможности остановки цикла
let isRun = true;

async function runWhile(time) {
  while (isRun) {
    await sleep(time);
  }
}

runWhile(1000);
// Тормозим выполнение через 6 секунд
setTimeout(() => isRun = false, 6000);

Вместо функции sleep подставьте вашу функцию addBD

→ Ссылка