JS Async / Await не работает в сочетании с forEach - PullRequest
0 голосов
/ 30 мая 2018

Вот код, с которым я работаю (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 голосов
/ 30 мая 2018

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 вернет Обещание, а затем вы можете использовать его с await:

const jobList = await getJobs()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...