在 NodeJS 的循环中每隔 X 秒调用一个函数
Call a function every X second in a loop in NodeJS
我的objective:每隔X秒调用一个函数。
我正在使用 Coinbase pro API 并获取我钱包的信息。每秒有 API 次调用的限制。所以我想每 5 秒为每个钱包调用我的函数 getWalletHistory()。
我有什么:我的函数 getWalletList() 被调用,然后我等待 5 秒来调用我的函数 getWalletHistory()。
我想要的:每 5 秒为每个钱包调用我的函数 getWalletHistory()。
var wallet_list = [];
getWalletList();
function getWalletList(){
authedClient.getAccounts().then(wallet_list_response => {
wallet_list_response.forEach(async wallet => {
console.log("WALLET LIST:" + wallet.id);
wallet_list.push(wallet);
});
console.log('**********END LOOP WALLET LIST');
getWalletHistory(wallet_list);
}).catch(error => {
// handle the error
console.log('ERROR getAccounts');
//console.log(error);
});
}
const getWalletHistory = async function(wallet_args){
wallet_args.forEach(async wallet => {
setTimeout(function(){
authedClient.getAccountHistory(wallet.id).then(order_list => {
console.log('*********response');
}).catch(error => {
// handle the error
console.log('ERROR getAccountHistory');
//console.log(error);
});
}, 5000);
});
}
更新
根据 Erenn 的评论,我使用 SetInterval 而不是 SetTimeout:
var wallet_list = [];
getWalletList();
function getWalletList(){
authedClient.getAccounts().then(wallet_list_response => {
wallet_list_response.forEach(async wallet => {
console.log("WALLET LIST:" + wallet.id);
setInterval(() => getWalletHistory(wallet), 5000);
});
console.log('**********END LOOP WALLET LIST');
}).catch(error => {
// handle the error
console.log('ERROR getAccounts');
//console.log(error);
});
}
const getWalletHistory = async function(wallet){
console.log('*********getWalletHistory:' + wallet.currency);
authedClient.getAccountHistory(wallet.id).then(order_list => {
console.log('*********response order_list');
}).catch(error => {
// handle the error
console.log('ERROR getAccountHistory');
//console.log(error);
});
}
我现在拥有的是:getAccountHistory() 在无限循环中每 5 秒为所有钱包调用一次。我想每 5 秒调用一次 getAccountHistory(),一次只调用 1 个钱包。
您可以维护一个列表队列,setInterval 可以每 5000 毫秒运行一次。在更新的代码段下方 查看 getWalletHistories
及其评论
var wallet_list = [];
getWalletList();
// responisble for maintaining queue (in the form of array) and setting interval
// Create a new reference of list, pop the item, calls getWalletHistory
// and once promise gets resolved, move the item back in the list (front of the array)
function getWalletHistories(walletList) {
let interval;
// clear interval counter if getWalletHistories called once again
if (interval) {
clearInterval(interval);
}
const _list = [...walletList];
interval = setInterval(() => {
// pop wallet item from list for get wallet item history
const wallet = _list.pop();
getWalletHistory(wallet).then(() => {
// push the popped wallet item back to the front of list
_list.unshift(wallet);
});
}, 5000);
}
function getWalletList() {
authedClient
.getAccounts()
.then((wallet_list_response) => {
getWalletHistories(wallet_list_response);
console.log("**********END LOOP WALLET LIST");
})
.catch((error) => {
// handle the error
console.log("ERROR getAccounts");
//console.log(error);
});
}
function getWalletHistories(walletList) {
let interval;
// clear interval counter if getWalletHistories called once again
if (interval) {
clearInterval(interval);
}
const _list = [...walletList];
interval = setInterval(() => {
// pop wallet item from list for getting wallet item history
const wallet = _list.pop();
getWalletHistory(wallet).then(() => {
// push the popped wallet item back to the front of list
_list.unshift(wallet);
});
}, 5000);
}
const getWalletHistory = async function (wallet) {
console.log("*********getWalletHistory:" + wallet.currency);
// return the wallet history promise
return authedClient
.getAccountHistory(wallet.id)
.then((order_list) => {
console.log("*********response order_list", order_list);
})
.catch((error) => {
// handle the error
console.log("ERROR getAccountHistory");
//console.log(error);
});
};
我的objective:每隔X秒调用一个函数。
我正在使用 Coinbase pro API 并获取我钱包的信息。每秒有 API 次调用的限制。所以我想每 5 秒为每个钱包调用我的函数 getWalletHistory()。
我有什么:我的函数 getWalletList() 被调用,然后我等待 5 秒来调用我的函数 getWalletHistory()。
我想要的:每 5 秒为每个钱包调用我的函数 getWalletHistory()。
var wallet_list = [];
getWalletList();
function getWalletList(){
authedClient.getAccounts().then(wallet_list_response => {
wallet_list_response.forEach(async wallet => {
console.log("WALLET LIST:" + wallet.id);
wallet_list.push(wallet);
});
console.log('**********END LOOP WALLET LIST');
getWalletHistory(wallet_list);
}).catch(error => {
// handle the error
console.log('ERROR getAccounts');
//console.log(error);
});
}
const getWalletHistory = async function(wallet_args){
wallet_args.forEach(async wallet => {
setTimeout(function(){
authedClient.getAccountHistory(wallet.id).then(order_list => {
console.log('*********response');
}).catch(error => {
// handle the error
console.log('ERROR getAccountHistory');
//console.log(error);
});
}, 5000);
});
}
更新 根据 Erenn 的评论,我使用 SetInterval 而不是 SetTimeout:
var wallet_list = [];
getWalletList();
function getWalletList(){
authedClient.getAccounts().then(wallet_list_response => {
wallet_list_response.forEach(async wallet => {
console.log("WALLET LIST:" + wallet.id);
setInterval(() => getWalletHistory(wallet), 5000);
});
console.log('**********END LOOP WALLET LIST');
}).catch(error => {
// handle the error
console.log('ERROR getAccounts');
//console.log(error);
});
}
const getWalletHistory = async function(wallet){
console.log('*********getWalletHistory:' + wallet.currency);
authedClient.getAccountHistory(wallet.id).then(order_list => {
console.log('*********response order_list');
}).catch(error => {
// handle the error
console.log('ERROR getAccountHistory');
//console.log(error);
});
}
我现在拥有的是:getAccountHistory() 在无限循环中每 5 秒为所有钱包调用一次。我想每 5 秒调用一次 getAccountHistory(),一次只调用 1 个钱包。
您可以维护一个列表队列,setInterval 可以每 5000 毫秒运行一次。在更新的代码段下方 查看 getWalletHistories
及其评论
var wallet_list = [];
getWalletList();
// responisble for maintaining queue (in the form of array) and setting interval
// Create a new reference of list, pop the item, calls getWalletHistory
// and once promise gets resolved, move the item back in the list (front of the array)
function getWalletHistories(walletList) {
let interval;
// clear interval counter if getWalletHistories called once again
if (interval) {
clearInterval(interval);
}
const _list = [...walletList];
interval = setInterval(() => {
// pop wallet item from list for get wallet item history
const wallet = _list.pop();
getWalletHistory(wallet).then(() => {
// push the popped wallet item back to the front of list
_list.unshift(wallet);
});
}, 5000);
}
function getWalletList() {
authedClient
.getAccounts()
.then((wallet_list_response) => {
getWalletHistories(wallet_list_response);
console.log("**********END LOOP WALLET LIST");
})
.catch((error) => {
// handle the error
console.log("ERROR getAccounts");
//console.log(error);
});
}
function getWalletHistories(walletList) {
let interval;
// clear interval counter if getWalletHistories called once again
if (interval) {
clearInterval(interval);
}
const _list = [...walletList];
interval = setInterval(() => {
// pop wallet item from list for getting wallet item history
const wallet = _list.pop();
getWalletHistory(wallet).then(() => {
// push the popped wallet item back to the front of list
_list.unshift(wallet);
});
}, 5000);
}
const getWalletHistory = async function (wallet) {
console.log("*********getWalletHistory:" + wallet.currency);
// return the wallet history promise
return authedClient
.getAccountHistory(wallet.id)
.then((order_list) => {
console.log("*********response order_list", order_list);
})
.catch((error) => {
// handle the error
console.log("ERROR getAccountHistory");
//console.log(error);
});
};