繁体   English   中英

循环通过 javascript 数组以延迟调用 API

[英]Loop through javascript array to call API with delay

我有一个调用Binance API的脚本。 我收到了针对特定符号的响应,例如BTCUSDT API 不允许在 API 端点中调用多个符号。 这个字符串 - var j = schedule.scheduleJob('0 * * * *', function()是一个节点调度 package它将在每小时 00 分钟(15:00/16:00/17:00.. .)。

全码

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 today = new Date();
 var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
 var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
 var dateTime = date + ' ' + time;

 var symbols = ["BTCUSDT", "ETHUSDT", "ATOMBTC"];
 let cnt = 0;

 const callIt = () => {
     fetch(`https://api.binance.com/api/v3/klines?symbol=${symbols[cnt]}&interval=1h&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])
                 }
             });
             console.log(btcusdtdata);
             cnt++;
             if (cnt < symbols.length) setTimeout(callIt, 3000)
         })
         .catch((err) => {
             console.log(err);
         })

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

问题:这个脚本一个接一个地调用数组中的属性,这对我来说是完美的。 我的问题是我的节点计划( 0 * * * * )不起作用。 我运行脚本,它会立即向我发送数据。 但我不想只每小时接收数据,而且只有在它调用数组中的属性之后才接收数据。 如何在主 function 中插入节点调度 function - const j = schedule.scheduleJob('0 * * * *', callIt) 一切正常,只是脚本假设在我启动它时不是立即每小时接收数据。

不要在区间内做 Ajax。 而是在回调中使用 setTimeout

像这样的东西 - 请注意,当您滥用 API 时,我在 catch() 中添加了一个拒绝以查看错误:

由于 CORS 问题,此处的代码在 SO 中不起作用

注意: ${symbols[cnt]}是诀窍

const symbols = ["BTCUSDT", "ETHUSDT", "ATOMBTC"];
let cnt = 0;


const callIt = () => {
  fetch(`https://api.binance.com/api/v3/klines?symbol=${symbols[cnt]}&interval=1h&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])
        }
      })
      console.log(btcusdtdata);
      cnt++;
      if (cnt < symbols.length) setTimeout(callIt, 3000)
    })
    .catch((err) => {
      console.log(err);
    })
};

// callIt(); // only to test without scheduler
const j = schedule.scheduleJob('* * * * * *', callIt); // assuming this will call it first time

我想破坏但失败了。 还是更优雅

 // https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1h&limit=1 const data = [ [1592215200000, "9147.70000000", "9150.00000000", "9107.00000000", "9114.93000000", "1335.61921100", 1592218799999, "12190574.36418155", 16160, "624.21625600", "5697793.49077209", "0"] ] const d = data[0].slice(1,6); const btcusdtdata = {}; ["Open", "High", "Low", "Close", "Volume"].forEach((name,i) => btcusdtdata[name]=+d[i]); console.log(btcusdtdata)

如果您想在固定时间之间执行任务,如下所示的wait function 将派上用场:

const symbols = ["BTCUSDT", "ETHUSDT", "ATOMBTC"];

function wait(ms) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, ms);
  });
}

const j = schedule.scheduleJob("* * * * * *", function () {
  ["BTCUSDT", "ETHUSDT", "ATOMBTC"].forEach((symbol, index) => {
    wait(2000 * index)
      .then(() =>
        fetch(
          `https://api.binance.com/api/v3/klines?symbol=${BTCUSDT}&interval=1h&limit=1`
        )
      )
      .then((res) => res.json())
      .then((data) => {
        console.log(data);
      })
      .catch(e => // do something with the error);
  });
});

如果你想一个接一个地执行异步任务, async/await关键字可以帮助你编写更简洁的代码:

const symbols = ["BTCUSDT", "ETHUSDT", "ATOMBTC"];

const j = schedule.scheduleJob("* * * * * *", async function () {
  for (let i = 0; i < symbols.length; i++) {
    try {
      const symbol = symbols[i];
      const res = await fetch(
        `https://api.binance.com/api/v3/klines?symbol=${BTCUSDT}&interval=1h&limit=1`
      );
      const data = await res.json();
      conosle.log(data);
    } catch (e) { // do something with the error }
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM