Использование async / await для поиска значения запроса cors?

#javascript #jquery #asynchronous #async-await

#javascript #jquery #асинхронный #async-await

Вопрос:

Я пытаюсь выполнить CORS запрос, затем использую async / await для извлечения из него значения (кстати, я использую jquery).

Я полагаю, что функции createCORSRequest и executeCORSRequest работают нормально, поэтому реализация на самом деле не имеет значения. Функция getDailyGames использует await для получения обещания, созданного из executeCORSRequest , а затем возвращает это обещание.

Моя проблема заключается в фактическом использовании promise в $(document) .ready функции (это, по сути, основная функция в jquery).

В закомментированной строке метод ‘.then’ используется для результата getDailyGames , чтобы распечатать результат функции (это работает нормально).

Однако я хочу сохранить значение этого обещания в переменной ‘result’ и что-то с ним сделать, но я не могу извлечь это из обещания.

Как мне правильно вернуть это обещание, чтобы я мог сохранить разрешенное значение в переменной и что-то с ним делать?

Или другой способ задать этот вопрос: почему переменная ‘result’ в getDailyGames получает обещание? Не следует ли использовать await с обещанием, чтобы получить разрешенное значение напрямую?

 $(document).ready(function() {    
  //getDailyGames(20190313).then(result => console.log(result));
  let result = getDailyGames(20190313);
  //DO STUFF WITH RESULT    
});

async function getDailyGames(date){    
  const url = 'https://api.jjjacobson.com/dailygames?season=2018-2019- 
  regularamp;date='   date;
  let result = await executeCORSRequest(url);
  return resu<    
}

function executeCORSRequest(url){
  return new Promise(function(resolve, reject) {
    const xhr = createCORSRequest('GET', url);
      if (!xhr) {
        throw new Error('CORS not supported');
      }
      xhr.onload = function() {
        resolve(xhr.responseText);
      };  

      xhr.onerror = function() {
        console.log('There was an error!');
        reject('ERROR');
      };    
      xhr.send();
    });
}

function createCORSRequest(method, url) {
  let xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {    
    // Check if the XMLHttpRequest object has a "withCredentials" property.
    // "withCredentials" only exists on XMLHTTPRequest2 objects.
    xhr.open(method, url, true);    
  } 
  else if (typeof XDomainRequest != "undefined") {    
    // Otherwise, check if XDomainRequest.
    // XDomainRequest only exists in IE, and is IE's way of making CORS requests.
    xhr = new XDomainRequest();
    xhr.open(method, url);    
  } 
  else {    
    // Otherwise, CORS is not supported by the browser.
    xhr = null;    
  }
  return xhr;
}
  

Ответ №1:

Вам следует изменить свою функцию document.ready на:

 $(document).ready(function() {

  let resu<
  getDailyGames(20190313).then(res => {
    result = res;
    //DO STUFF WITH RESULT

  });
});
  

Await работает только тогда, когда сама функция является асинхронной. Вы также могли бы сделать это

 $(document).ready(async function() {

  let result = await getDailyGames(20190313);
  //DO STUFF WITH RESULT

});
  

Ответ №2:

Async / await — это всего лишь синтаксический сахар, направленный на устранение ада обратного вызова. Следует хорошо помнить, что где-то в конце асинхронной цепочки вам придется иметь дело с обещанием. Именно по этой причине вы можете использовать await только внутреннюю async функцию, и, к сожалению, корень скрипта не является async функцией.

В вашем случае, если вы хотите сериализовать вызов getDailyGames , создайте в document.ready асинхронную функцию, как указано @varun.