我试图在我的代码中实现一个异步函数,并最终使其真正正确地等待,但是,在等待之后,它似乎只是停止了。
function onLoad() {
fillTechOptions();
}
function getData() {
return new Promise(resolve => {
// var XMLHttpReqeust = require("xmlhttprequest").XMLHttpReqeust;
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if ( xhr.readyState == xhr.DONE && xhr.status == 200 ) {
var dataset = xhr.responseText
dataset = JSON.parse(dataset);
console.log(dataset.recordset);
data2 = dataset.recordset;
}
// if (xhr.readyState == 2){
// xhr.responseType = 'json';
// }
};
xhr.open('GET', 'http:localhost:5000/data', true);
xhr.withCredentials = false;
xhr.send();
});
}
async function fillTechOptions() {
alert("ran function");
await getData();
alert("continuing");
var techSkills = ['All Skills'];
for(var x = 0; x < data2; x++){
techSkills.push(data2.SkillName);
};
select = document.getElementById('techSkillsSelectID');
for (var i = 0; i<techSkills; i++){
var opt = document.createElement('option');
opt.value = techSkills[i];
opt.innerHTML = techSkills[i];
select.appendChild(opt);
};
}
HTML正文加载后,
onload()就会运行,这会调用应该等待的函数。我首先收到该函数正在运行的警报,然后第二次我的数据集出现在控制台中,然后停止。我再也没有收到第二次警报。任何想法为什么会这样?
答案 0 :(得分:0)
您需要通过调用resolve来解决承诺,将异步操作(getData)标记为已完成(如果出现问题,则拒绝)
答案 1 :(得分:0)
对于诺言,您需要致电解决或拒绝以让诺言知道其失败还是成功
new Promise((resolve, reject) => {
xhr.onreadystatechange = function() {
if (xhr.readyState == xhr.DONE) {
if (xhr.status == 200) {
var dataset = xhr.responseText
dataset = JSON.parse(dataset);
console.log(dataset.recordset);
resolve(dataset.recordset);
} else {
// You can deal with errors here
reject();
}
}
};
});