JavaScript异步/等待:等待后代码不会继续[重复]

Posted

技术标签:

【中文标题】JavaScript异步/等待:等待后代码不会继续[重复]【英文标题】:JavaScript async/await: Code won't continue after await [duplicate] 【发布时间】:2019-07-07 17:39:33 【问题描述】:

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

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);
    ;

onload() 在 HTML 主体加载后运行,它调用应该等待的函数。我收到函数运行的第一个警报,然后一秒钟后我的数据集出现在控制台中,然后它就停止了。我从来没有收到第二个警报。任何想法为什么会发生这种情况?

【问题讨论】:

可能是因为resolve 没有在getData() 中调用?尝试在 onreadystatechange 处理程序中添加 resolve() @SunnyPun 做到了。谢谢! 【参考方案1】:

您需要通过调用 resolve 来解决承诺,以便将异步操作 (getData) 标记为已完成(如果出现问题则拒绝)

【讨论】:

【参考方案2】:

对于 Promise,您需要调用 resolvereject 让 Promise 知道它是失败还是成功

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();
      
    
  ;

);

【讨论】:

以上是关于JavaScript异步/等待:等待后代码不会继续[重复]的主要内容,如果未能解决你的问题,请参考以下文章

异步等待不等待完成

Javascript:永远不会从等待返回

异步/等待 Discord.js Node.js Javascript JS

理解Javascript的异步等待

节点在继续之前等待异步功能

在继续之前等待图像加载