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