异步/等待功能不等待承诺结束

时间:2019-01-07 18:24:06

标签: javascript async-await

let myObject = ( () => {

  let run = async() => {
    foo = new genericFunction();
    status = await foo.myFunction();
  }

})();

另一个FIle.js

let genericFunction = function() {


  this.getData = async () => {
    $.getJSON("path/to/file.json", function (data) {
      console.log("Apple", data.name);
      return data.name;
    }).fail(function(jqxhr, textStatus, error){
      console.log("Loading Error :: ", error);
    )};

  }


  this.myFunction = async () => {
    let data = this.getData();
    console.log('DATAA:::', data); //This should be the first output
  }

}

问题是: status始终为= undefined,因为它以某种方式在getJSON执行之前返回,我不知道为什么。

2 个答案:

答案 0 :(得分:1)

另一个FIle.js 应该类似于:

let genericFunction = function() {


  this.getData = async () => {
    var result = await $.getJSON("path/to/file.json", function (data) {
      console.log("Apple", data.name);
      return data.name;
    }).catch(function(jqxhr, textStatus, error){
      console.log("Loading Error :: ", error);
    )};

    return result;
  }


  this.myFunction = async () => {
    let data = this.getData();
    console.log('DATAA:::', data); //This should be the first output
  }

}

答案 1 :(得分:1)

这是使用您的代码的简化示例,但有一些更改:

1)使用class

2)您不会从myFunction返回任何内容,因此没有理由为status分配某些内容-只需调用该函数即可。

3)getData不需要async关键字,您需要从函数中返回promise(在本示例中,我模拟了一个AJAX调用,该调用会在几秒钟后返回数据)。

4)您确实需要await才能返回myFunction。您在那里有async,也只需要添加await关键字。

class GenericFunction {

  getData() {
    return new Promise(resolve => {
      setTimeout(() => resolve('Hello World'), 2000);
    });
  }

  async myFunction() {
    let data = await this.getData();
    console.log('DATAA:::', data);
  }

}

(async () => {
  const foo = new GenericFunction();
  foo.myFunction();
})();