JS Async / Await与forEach不兼容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS Async / Await与forEach不兼容相关的知识,希望对你有一定的参考价值。

这是我正在使用的代码(由于显而易见的原因,IP地址被删除):

async function buildJobsView() {
    let jobList = await getJobs()
    Promise.all([getJobs()]).then($("#jobsPane").text(jobList))
}

async function getJobs() {
    //Open API connection and submit
    var url = "http://IPADDRESS:8082/api/jobs?IdOnly=true"
    var xhr = new XMLHttpRequest()
    xhr.open("GET", url, true)
    xhr.send()
    xhr.onreadystatechange = function() {
        if(xhr.readyState == 4 && xhr.status == "200") {
            return xhr.response
        }
    }
}

无论出于何种原因,jobList变量在getJobs()函数完成运行之前被赋值。 getJobs()函数最终会返回正确的输出,但代码已经移动了。我究竟做错了什么?

答案

async不会自动将基于回调的代码转换为基于Promise的代码 - 只要您希望能够将其用作Promise,就必须将回调显式转换为Promise并返回Promise。

function getJobs() {
  return new Promise((resolve) => {
    //Open API connection and submit
    var url = "http://IPADDRESS:8082/api/jobs?IdOnly=true"
    var xhr = new XMLHttpRequest()
    xhr.open("GET", url, true)
    xhr.send()
    xhr.onreadystatechange = function() {
      if(xhr.readyState == 4 && xhr.status == "200") {
        resolve(xhr.response)
      }
    }
  });
}

然后,getJobs将返回一个Promise,然后你可以用await消费它:

const jobList = await getJobs()

以上是关于JS Async / Await与forEach不兼容的主要内容,如果未能解决你的问题,请参考以下文章

Parallel.ForEach 和 async-await [重复]

javascript node.js async-await electron

forEach 和 await/async 的问题

js异步回调Async/Await与Promise区别 新学习使用Async/Await

forEach中使用async await的问题

js异步回调Async/Await与Promise区别