【发布时间】:2020-06-24 12:51:25
【问题描述】:
我自己可能已经把这个问题复杂化了。我的页面中有 2 个 XMLHTTPRequest,第一个请求从 API 获取一些数据,然后我想用这些数据填充我的元素,现在问题是其中一个我的元素的字段需要向不同的端点发送第二个请求,以使用从第一个请求收到的值之一获取其数据,但它始终填充有 undefined
我知道这是由于请求的异步性质,站点将继续加载并且不会等待请求完成,所以我尝试使第二个请求同步,但同样的事情发生了(只是现在站点冻结了一秒钟),我也尝试使用异步等待,但我的文本编辑器说“等待对这个表达式的类型没有影响”,我完全卡住了..
我相信这是由于我对异步 javascript 缺乏经验和理解(这是我第一个使用它的应用程序)..
这是我的代码:
let ourGrid=document.getElementById("res");
let searchValue;
function search(){
searchValue=document.getElementById("search").value;
getFoods(`https://api.spoonacular.com/recipes/findByIngredients?ingredients=${searchValue}&number=2&apiKey=${apikey}`);
}
function getFoods(url){
let xhr=new XMLHttpRequest();
xhr.responseType='json';
xhr.onreadystatechange=()=>{
if(xhr.readyState==XMLHttpRequest.DONE){
setFoods(xhr.response);
}else{
return "error";
}
}
xhr.open('GET',url);
xhr.send();
}
function setFoods(json){
if(json.length==0){
alert(`no results found for ${searchValue}`);
}else{
ourGrid.innerHTML=json.map(foodLogic).join("");
}
}
function foodLogic(foodItem){
return `<div class="imageItem"><img src="${foodItem.image}"></div>
<div class="infoItem"><h2>${foodItem.title}</h2>
<p class="summary">${requestSummary(foodItem.id)}</p>
<p class="more"><a href="./moreInfo.html" target="_blank">More</a></p></div>
`
}
function requestSummary(id){
let url2=`https://api.spoonacular.com/recipes/${id}/summary?apiKey=${apikey}`;
let xhr2=new XMLHttpRequest();
xhr2.onreadystatechange=()=>{
if(xhr2.readyState==XMLHttpRequest.DONE){
return returnSummary(JSON.stringify(xhr2.response));
}
}
xhr2.open('GET',url2,false);
xhr2.send();
}
function returnSummary(json){
return json.summary;
};
【问题讨论】:
-
你尝试过承诺吗?还是回调?
-
我想尝试使用一个 Promise,但我不明白如何使它工作,该 Promise 需要一个带有解析和拒绝参数的执行器函数..我不知道在哪里/如何在里面写我自己的功能
标签: javascript ajax xmlhttprequest