嗨,我在使用axios / fetch GET和一个URL时遇到问题,该URL的参数通过数组循环对其值进行迭代
axios / fetch不遵循数组的顺序,仅返回最先出现的响应。
我该如何解决?
const fetch = require("node-fetch");
algo = "eth" // algorithm for wtt
hashrate = ['250', '100', '50']
console.log(hashrate)
for (var i = 0; i < vhr.length; i++){
var wttURL = "https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]
fetch(wttURL)
.then((resp) => resp.json()) // Transform the data into json
.then(function(data) {
console.log(data.coins.Ethereum.btc_revenue)
})
当前的输出是250(a),100(b)或50(c)的结果
所以基本上它要么以
的形式出现a,b,c(需要)
b,c,a
a,c,b
c,b,a
等
但是我希望它按照顺序输出,所以应该是
a,b,c始终
答案 0 :(得分:2)
您可以通过以下方式使用递归:
function fetchRecursively(int currentStep, int n) {
var wttURL = "https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[currentStep]
fetch(wttURL)
.then((resp) => resp.json()) // Transform the data into json
.then(function(data) {
console.log(data.coins.Ethereum.btc_revenue);
if (currentStep < n) {
fetchRecursively(currentStep + 1, n);
}
})
}
并替换为循环:
for (var i = 0; i < vhr.length; i++){
var wttURL = "https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]
fetch(wttURL)
.then((resp) => resp.json()) // Transform the data into json
.then(function(data) {
console.log(data.coins.Ethereum.btc_revenue)
})
与此:
fetchRecursively(0, vhr.length);
答案 1 :(得分:2)
使用Promise.all,以保留订单。
在for循环中,iam创建三个访存承诺并进行链接,然后以json格式获取响应并将其推入数组。
最后,我正在使用Promise.all在prdefined formar中获取数据
const fetch = require("node-fetch");
algo = "eth" // algorithm for wtt
hashrate = ['250', '100', '50']
console.log(hashrate)
var fetchUrl =[]
for (var i = 0; i < vhr.length; i++){
return fetchUrl.push(fetch("https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]).then(response => response.json())
}
Promise.all(fetchUrl)
.then(function(data) {
data.forEach(a => a.coins.Ethereum.btc_revenue)
})
答案 2 :(得分:1)
选项1:Promise.all
简而言之:如果需要特定的订单,可以使用Promise.all()。您创建一个填充有承诺的数组,将其传递给Promise.all()
,您将获得一个包含已解决的承诺的数组。
const fetch = require("node-fetch");
algo = "eth" // algorithm for wtt
hashrate = ['250', '100', '50']
wttURL = [];
for (var i = 0; i < vhr.length; i++) {
wttURL.push(fetch("https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]))
}
Promise.all(wttURL)
.then(responses => responses.forEach(response => console.log(response)))
.catch(err => console.log(err));
但是,它失败的原因是第一个承诺被拒绝。因此,如果您的数组很大,或者需要显示任何数据,则不应使用此方法。另外,这将只保留客户的订单!您的后端对订单一无所知,因为调用未按顺序进行。
选项2:异步/等待
您可以改用async/await
。您将await
的每个结果,如果其中任何一个失败,您将不在乎,因为其余结果仍然可以成功。另外,您的后端也可以跟踪订单。
async function getData() {
for (var i = 0; i < vhr.length; i++) {
let wttURL = "https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]
await fetch(wttURL)
.then(resp => resp.json()) // Transform the data into json
.then(data => console.log(data.coins.Ethereum.btc_revenue))
.catch(err => console.log(err));
}
}
这种方法保留了客户端和后端(如果您记录的话)上的原始订单。但是,它比第一个解决方案要慢,因为它直到承诺被解决才继续下一个fetch
。