JavaScript异步/等待:等待后代码不会继续

时间:2019-02-13 19:16:43

标签: javascript async-await

我试图在我的代码中实现一个异步函数,并最终使其真正正确地等待,但是,在等待之后,它似乎只是停止了。

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()就会运行,这会调用应该等待的函数。我首先收到该函数正在运行的警报,然后第二次我的数据集出现在控制台中,然后停止。我再也没有收到第二次警报。任何想法为什么会这样?

2 个答案:

答案 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();
      }
    }
  };

});