Javascript 无法将XMLHttpRequest设置为3个单独的API URL
在开始之前,这里是API。超级简单: 需要注意的是,我以前使用过api,但我使用了wait async函数,但由于某些原因,我无法使用该函数……但我找到了一个使用XML http请求实现此功能的教程,因此我决定继续使用XML实现此功能,因为我能够制作一个简单的比特币代码 我正在构建一个简单的小部件,使用cryptonator API显示比特币、莱特币和以太坊的价格。正如我上面所说的,我制作了一个带有第一个功能的比特币自动售票机(见下面的代码),效果非常好。然而,我在尝试获得3种不同的货币时遇到了问题 这就是我要做的Javascript 无法将XMLHttpRequest设置为3个单独的API URL,javascript,api,xmlhttprequest,Javascript,Api,Xmlhttprequest,在开始之前,这里是API。超级简单: 需要注意的是,我以前使用过api,但我使用了wait async函数,但由于某些原因,我无法使用该函数……但我找到了一个使用XML http请求实现此功能的教程,因此我决定继续使用XML实现此功能,因为我能够制作一个简单的比特币代码 我正在构建一个简单的小部件,使用cryptonator API显示比特币、莱特币和以太坊的价格。正如我上面所说的,我制作了一个带有第一个功能的比特币自动售票机(见下面的代码),效果非常好。然而,我在尝试获得3种不同的货币时遇到了
var url = "https://api.cryptonator.com/api/ticker/btc-usd";
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var json = JSON.parse(this.responseText);
parseJson(json);
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
function parseJson(json) {
var usdValue = json["ticker"]["price"];
document.getElementById("data").innerHTML = usdValue;
var usdValue = usdValue.replace(/[^\d.\-]/g, "");
var usd = parseFloat(usdValue);
document.getElementById("data").innerHTML = "$ " + usd.toFixed(2);
}
//
//
var xmlhttp2 = new XMLHttpRequest();
var url2 = "https://api.cryptonator.com/api/ticker/ltc-usd";
xmlhttp2.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var json = JSON.parse(this.responseText);
parseJson(json);
}
};
xmlhttp2.open("GET", url2, true);
xmlhttp2.send();
function parseJson(json) {
var LTCusdValue = json["ticker"]["price"];
// document.getElementById("data2").innerHTML = LTCusdValue;
var LTCusdValue = LTCusdValue.replace(/[^\d.\-]/g, "");
var LTCusd = parseFloat(LTCusdValue);
document.getElementById("data2").innerHTML = "$ " + LTCusd.toFixed(2);
}
//
//
//
var xmlhttp3 = new XMLHttpRequest();
var url3 = "https://api.cryptonator.com/api/ticker/eth-usd";
xmlhttp3.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var json = JSON.parse(this.responseText);
parseJson(json);
}
};
xmlhttp3.open("GET", url3, true);
xmlhttp3.send();
function parseJson(json) {
var ETHusdValue = json["ticker"]["price"];
// document.getElementById("data3").innerHTML = ETHusdValue;
var ETHusdValue = ETHusdValue.replace(/[^\d.\-]/g, "");
var ETHusd = parseFloat(ETHusdValue);
document.getElementById("data3").innerHTML = "$ " + ETHusd.toFixed(2);
}
正如您所看到的,我试图向3个不同的API发出3个请求,但它不起作用。如果我注释掉这些函数中除一个之外的所有函数,它就可以正常工作。当我试图同时使用所有3个时,我的问题就出现了。如果我只使用比特币和莱特币,它实际上会工作,但在我尝试使用第三个函数(以获取以太坊价格)时会再次中断。您应该能够使用..为其编写异步包装函数。。这将允许您将
async
/wait
与XHR
一起使用
要使使用XHR
更容易,可以使用内置。。据介绍,大多数浏览器都支持fetch
。。总之,我更喜欢使用fetch
而不是XHR
等等。。但由于您特别询问了XHR
,我就是这样回答的
如果您不想等待每个响应,可以执行以下操作:
//用于“get”的基本XHR包装函数
函数getXHR(url){
返回新承诺(功能(解决、拒绝){
const xhr=new XMLHttpRequest();
xhr.open(“get”,url,true);
xhr.onreadystatechange=函数(){
if(this.readyState==4&&this.status==200){
此状态==200
?解决(此.responseText)
:拒绝(此状态);
}
};
xhr.send();
});
}
const-etElement=document.getElementById(“eth”);
常量bcElement=document.getElementById(“bc”);
const lcElement=document.getElementById(“lc”);
//乙醚
getXHR(“https://api.cryptonator.com/api/ticker/eth-usd")
。然后(eth=>{
//可以像这样转换为JSON:
//const ethJson=JSON.parse(eth);
etElement.innerHTML=eth;
})
//比特币
getXHR(“https://api.cryptonator.com/api/ticker/btc-usd")
.然后(bc=>{
//可以像这样转换为JSON:
//const bcJson=JSON.parse(bc);
bcElement.innerHTML=bc;
})
//莱特币
getXHR(“https://api.cryptonator.com/api/ticker/ltc-usd")
。然后(lc=>{
//可以像这样转换为JSON:
//const lcJson=JSON.parse(lc);
lcElement.innerHTML=lc;
})
eth:
卑诗省:
莱特币:
您应该能够使用..为其编写异步包装函数。。这将允许您将async
/wait
与XHR
一起使用
要使使用XHR
更容易,可以使用内置。。据介绍,大多数浏览器都支持fetch
。。总之,我更喜欢使用fetch
而不是XHR
等等。。但由于您特别询问了XHR
,我就是这样回答的
如果您不想等待每个响应,可以执行以下操作:
//用于“get”的基本XHR包装函数
函数getXHR(url){
返回新承诺(功能(解决、拒绝){
const xhr=new XMLHttpRequest();
xhr.open(“get”,url,true);
xhr.onreadystatechange=函数(){
if(this.readyState==4&&this.status==200){
此状态==200
?解决(此.responseText)
:拒绝(此状态);
}
};
xhr.send();
});
}
const-etElement=document.getElementById(“eth”);
常量bcElement=document.getElementById(“bc”);
const lcElement=document.getElementById(“lc”);
//乙醚
getXHR(“https://api.cryptonator.com/api/ticker/eth-usd")
。然后(eth=>{
//可以像这样转换为JSON:
//const ethJson=JSON.parse(eth);
etElement.innerHTML=eth;
})
//比特币
getXHR(“https://api.cryptonator.com/api/ticker/btc-usd")
.然后(bc=>{
//可以像这样转换为JSON:
//const bcJson=JSON.parse(bc);
bcElement.innerHTML=bc;
})
//莱特币
getXHR(“https://api.cryptonator.com/api/ticker/ltc-usd")
。然后(lc=>{
//可以像这样转换为JSON:
//const lcJson=JSON.parse(lc);
lcElement.innerHTML=lc;
})
eth:
卑诗省:
莱特币:
如果我很了解您,您可以为所有加密创建一个方法,并避免重复相同的代码。如果您运行下面的示例,您将能够看到所有加密,并且很容易添加新的加密:
consturl='1〕https://api.cryptonator.com/api/ticker/'
常量加密=['btc'、'ltc'、'eth']
cryptos.map(crypto=>{
获取(`${URL}${crypto}-usd`)
.then(data=>data.json())
.then({ticker:{base,price}})=>console.log(`${base}:${(+price).toFixed(2)}`)
})
如果我很了解您,您可以为所有加密创建一个方法,并避免重复相同的代码。如果您运行下面的示例,您将能够看到所有加密,并且很容易添加新的加密:
consturl='1〕https://api.cryptonator.com/api/ticker/'
常量加密=['btc'、'ltc'、'eth']
cryptos.map(crypto=>{
获取(`${URL}${crypto}-usd`)
.then(data=>data.json())
.then({ticker:{base,price}})=>console.log(`${base}:${(+price).toFixed(2)}`)
})函数定义了三次。这意味着每次编写函数时,它都会覆盖以前的定义。因此,在您的情况下,只有最后一个parseJson
函数将用于所有三个请求。你可以做几件事
写三种不同的变体。(坏习惯)
虽然这将是
function parseJson1(json) {
...
}
function parseJson2(json) {
...
}
function parseJson3(json) {
...
}
function parseJson(json, id) {
var output = document.getElementById(id); // Select the element based on the id.
if (output === null) { // If element is not found, stop the function.
return;
}
var price = json["ticker"]["price"];
var usdValue = price.replace(/[^\d.\-]/g, "");
var usd = parseFloat(usdValue);
output.innerHTML = "$ " + usd.toFixed(2);
}