Как остановить setTimeout внутри цикла - PullRequest
0 голосов
/ 19 июня 2020

Это вопрос продолжения из этого потока - setTimeout внутри al oop, останавливает работу скрипта

У меня есть скрипт, который получает данные из API и сохраняет их внутри коллекция MongoDB. Проблема в том, что setTimeout() не позволяет скрипту запускаться второй раз. Я на 99,9% уверен, что проблема именно в нем.

Обзор проблемы - Будьте осторожны при использовании SetTimeout () в For L oop # JS

Проблема c область кода:

const callIt = () => {


    fetch(`https://api.binance.com/api/v3/klines?symbol=${symbols[cnt]}&interval=30m&limit=1`)
        .then(res => res.json())
        .then(data => {
            const btcusdtdata = data.map(d => {
                return {
                    Open: parseFloat(d[1]),
                    High: parseFloat(d[2]),
                    Low: parseFloat(d[3]),
                    Close: parseFloat(d[4]),
                    Volume: parseFloat(d[5]),
                    Timespan: 30,
                }
            });
            console.log(btcusdtdata);
            saveToDatebase(btcusdtdata);
            cnt++;
            if (cnt < symbols.length) setTimeout(callIt, 3000)  
        })
        .catch((err) => {
            console.log(err);

        })

};

Этот скрипт вызывает API, а затем проходит через массив для получения символов. Как я могу остановить setTimeout() после прохождения всего массива?

Я пытался добавить что-то вроде clearTimeout(callIt), у меня не работает.

EDIT1

Ошибка: - TypeError: data.map is not a function

FULLCODE

var requestPromise = require('request-promise');
const { MongoClient } = require('mongodb');
const schedule = require('node-schedule');
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
const fetch = require("node-fetch");



var symbols = ["ZRXBTC",
    "LENDBTC",
    "AEBTC",
    "AIONBTC",
    "ALGOBTC",
    "ARDRBTC",];
let cnt = 0;
    const callIt = () => {
    fetch(`https://api.binance.com/api/v3/klines?symbol=${symbols[cnt]}&interval=30m&limit=1`)
        .then(res => res.json())
        .then(data => {
            const btcusdtdata = data.map(d => {
                return {
                    Open: parseFloat(d[1]),
                    High: parseFloat(d[2]),
                    Low: parseFloat(d[3]),
                    Close: parseFloat(d[4]),
                    Volume: parseFloat(d[5]),
                    Timespan: 30,
                }
            });
            console.log(btcusdtdata);
            saveToDatebase(btcusdtdata);
            cnt++;
            if (cnt < symbols.length) setTimeout(callIt, 3000)
        })
        .catch((err) => {
            console.log(err);

        })

};
const j = schedule.scheduleJob('*/1 * * * *', callIt)

const saveToDatebase = function(BTCdata) {

    const url = 'mongodb+srv://username:password@cluster0-1kunr.mongodb.net/<dbname>?retryWrites=true&w=majority';

    var today = new Date();
    var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
    var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
    var dateTime = date + ' ' + time;

    MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
        if (err) throw err;
        const dbo = db.db('CryptoCurrencies');
        const myobj = { Name: symbols[cnt - 1], Array: BTCdata, Date: dateTime };
        dbo.collection(`${symbols[cnt - 1]}`).insertOne(myobj, (error, res) => {
            if (error) throw error;
            console.log('1 document inserted');
            db.close();
        });
    });

};

1 Ответ

0 голосов
/ 19 июня 2020

Сценарий, который я написал для вас в другом посте, который вы называете проблемой c, работает без clearTimeout - происходит что-то еще

Вы можете ПЕРЕМЕСТИТЬ if (cnt < symbols.length) setTimeout(callIt, 3000); сразу после db.close();, если вы хотите

const symbols = ["ZRXBTC",
"LENDBTC",
"AEBTC",
"AIONBTC",
"ALGOBTC",
"ARDRBTC",];
cnt = 0
const callIt = () => {
  console.log(`https://api.binance.com/api/v3/klines?symbol=${symbols[cnt]}&interval=30m&limit=1`)
  cnt++;
  if (cnt < symbols.length) setTimeout(callIt, 3000);
  else console.log("done!")
};
callIt()
...