Нужно дождаться обещанного результата от кода верхнего уровня - PullRequest
0 голосов
/ 05 июня 2019

Мне нужно сделать асинхронный вызов стороннего API, и я хочу, чтобы выполнение кода ожидало ответа.

async function getOrderData(orderId) {
  return new Promise(function (resolve, reject) {
    var service = new APIservice();
    service.GetOrderData(oid, function (event) {
      if (event && event.hasErrors() == false) {
        resolve(event.result);
      } else {
        reject(null);
      }
    });
  });
}

var order = getOrderData(orderId);
//from here the code should only resume once the var order is defined with whatever's returned from the api

Это код верхнего уровня (не асинхронный), поэтому я не могу использоватьawait.

РЕДАКТИРОВАТЬ: Отвечая на некоторые предложения:

this.$onInit = function () {
    this.order = "wrong value";
    getOrderData(orderId).then(order => {
        this.order = "correct value";
    });
};

эта функция закончится с "test", являющимся "неправильное значение".Это то, чего я пытаюсь избежать.

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Вы можете await Promise, возвращаемое getOrderData().

Однако, чтобы использовать await, вам нужно обернуть ваш вызов в getOrderData в функции async (на данный момент нет такого понятия, как await верхнего уровня - это может однажды однако, вещь . В настоящее время ее можно использовать только внутри async функции):

// getOrderData function initializaion...

(async _ => {
  var order = await getOrderData(orderId); // wait to recieve data before proceeding
  // You can now write code wih `order`
})().catch(err => {
  console.error(err);
});

Кроме того, вы можете написать свой код в .then обратном вызове (для которого await является просто синтаксическим сахаром) из возвращенных Promise из getOrderData() следующим образом:

// getOrderData function initializaion...

getOrderData(orderId).then(order => {
  // write code in here which relies on `order`
}).catch(err => {
  console.error(err);
});;
0 голосов
/ 05 июня 2019

вам нужно что-то вроде этого:

async function the_whole_thing() {
  async function the_api_wrapper() {
    return new Promise((resolve, reject) => {
      setTimeout(() => resolve('joe!'), 10);
    });
  }
  
  let result = await the_api_wrapper();
  console.log(result);
}

the_whole_thing();

Примечание # 1 : я только что обменял API, который вы вызываете, с setTimeout, так как это также функция, которая принимает обратный вызов (аналогично вашему случаю), и это также гарантирует, что все происходит асинхронно .

Примечание # 2 : обратите внимание, что синтаксис async/await может использоваться только в теле другой функции async, поэтому я обернул все это, ну, в общем, в the_whole_thing.

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