Состояние async-await разрешено, но ajax не завершен - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь дождаться вызова getJson и обработать возвращаемые данные.Я видел много ответов и пытался использовать $.ajax async: false (не работает, потому что запрос является междоменным), обратные вызовы и часть .done основного вызова $.ajax.Сейчас я пытаюсь асинхронно ждать.Мой код выглядит так:

var ths = getTrailheads(turl);
console.log("trailheads promise");
console.log(ths);
ths.then(function(data) {
  addTrailheadsToMap(data);
});

async function getTrailheads(turl) {
  var result = await $.ajax({
    url: turl,
    datatype: 'json'
  });

  return result;
}

Иногда это работает, если вызов ajax возвращается достаточно быстро, но в основном журнал консоли показывает:

promise object

Показывает обещание с status, установленным на Resolved.Объект обещания есть, но статус объекта показывает Processing.

Это частый случай, но общие ответы, похоже, не работают для меня, поэтому любая помощь будет оценена.

обновление:

  preGetTrailheads(turl);
}
async function preGetTrailheads(turl) {
  var ths = await getTrailheads(turl);
  console.log("trailheads promise");
  console.log(ths);
  addTrailheadsToMap(ths);

}
async function getTrailheads(turl) {
  var result = await $.ajax({
    url: turl,
    datatype: 'json'
  });

  return result;
}

Теперь я возвращаю объект вместо обещания, но объект все еще "Обрабатывается", а затем завершается ошибкой, когда я пытаюсь его использовать. объект дампа

Обновление 2: Я уверен, что вы оба, ребята, правы, и то, как вы описываете, это то, как вы это делаете.У меня здесь есть кодекс https://codepen.io/mckee80/pen/KJBbvz.Это работает большую часть времени.Кажется, что он завершается сбоем только при первом запуске (кроме того, выходные данные попадают в журнал браузера, если он успешен).Мне просто нужно выяснить, почему это происходит в моем приложении.Странно, это работает для данного набора данных, если я перезагружаю страницу.

1 Ответ

0 голосов
/ 13 февраля 2019

Вы используете async / await внутри getTrailheads правильно, но код, вызывающий его, также должен использовать async / await или иным образом обрабатывать обещания.Предполагая, что код может быть async, вам, вероятно, нужно просто добавить await перед вызовом:

var ths = await getTrailheads(turl);

async / await - более или менее синтаксический сахар поверх обещаний,вот почему не ожидая результата getTrailheads возвращает обещание.Вы также можете использовать getTrailheads(turl).then(ths => {...}), если это работает лучше.

...