[英]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.