JS Async / Await不与forEach结合使用

时间:2018-05-29 22:11:35

标签: javascript asynchronous async-await

以下是我正在使用的代码(由于显而易见的原因,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()函数最终会返回正确的输出,但代码已经移动了。我做错了什么?

1 个答案:

答案 0 :(得分:2)

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