需要等待顶级代码的承诺结果

时间:2019-06-05 15:33:27

标签: javascript promise

我必须异步调用第三方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";
    });
};

此功能将以“测试”为“错误值”结束。这就是我要避免的事情。

2 个答案:

答案 0 :(得分:2)

您可以await Promise返回的getOrderData()

但是,要使用await,您需要在getOrderData函数中包装对async的调用(在目录中没有顶层await这样的东西此刻-可能{em> 一天be a thing。目前,它只能在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的{​​{1}}的{​​{1}}回调(await只是语法糖)中编写代码,如下所示:< / p>

Promise

答案 1 :(得分:0)

您需要这样的东西:

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 :我刚刚用setTimeout换出了您正在调用的API,因为它也是一个需要回调的函数(类似于您的情况),并且还可以确保事情是异步发生的。

注释#2 :请注意,async/await语法只能在另一个async函数的主体中使用,所以这就是为什么我将整个内容包装好了,在the_whole_thing中。