【问题标题】:Why doesn't 'await' wait?为什么不“等待”等待?
【发布时间】:2018-10-26 23:30:53
【问题描述】:

我是 Javascript 中的 await/async 函数的新手。我写了以下函数:

getGoogleResults = async () => {
    const googleResultUrl = 'http://www.google.com/search?q=bakery&num=60');

    // get only Divs within results that have class of 's'
    $.getJSON(googleResultUrl, (data) => {
      const results = $(data.contents).find('div[class="g"]');
      const divs = results.find('div[class="s"]');
      console.log(data.contents); // data logged here looks fine in console
      return data.contents; 
    });
  }

此功能运行良好,我可以将响应注销到控制台并查看解析出的数据(前 60 个 Google 结果)。

但是,我不明白的是,当我调用该函数时,我希望它等到承诺返回后再继续。但是,事实并非如此。当我调用该函数时,程序会立即运行下一行(到控制台的日志),而无需等待:

async startProcess() {
    const googleResults = await this.getGoogleResults();
    console.log(googleResults); // this gets run immediately, produces 'undefined' in console
  }

记录到控制台的内容是“未定义”。所以,很明显,我做错了什么,但我找不到一个例子来说明那可能是什么。就像程序调用了函数,但没有等待承诺就立即继续。

编辑:我知道我的函数此时只是返回 data.contents,而不是解析的 Div。我现在只是在测试,想在调用 async 函数后查看结果。

【问题讨论】:

  • 你没有从getGoogleResults返回任何东西,所以awaiting它的结果是undefined
  • 'return data.contents' 语句不返回一些东西吗?
  • return 声明 inside $.getJSON() 回调没有做任何有用的事情,特别是它不会影响您的 async 函数的返回值.
  • 当然可以,但它不会影响外部函数getGoogleResults,它不会返回任何内容。
  • 如果 $ 是 jquery 你不需要像答案建议的那样返回新的承诺。只需返回 $.getJSON()

标签: javascript asynchronous async-await


【解决方案1】:

你需要从函数getGoogleResults返回一个Promise对象

getGoogleResults = () => { // You don't need the async keyword here
    return new Promise((resolve, reject) => {
        const googleResultUrl = 'http://www.google.com/search?q=bakery&num=60');
        // get only Divs within results that have class of 's'
        $.getJSON(googleResultUrl, (data) => {
          const results = $(data.contents).find('div[class="g"]');
          const divs = results.find('div[class="s"]');
          console.log(data.contents); // data logged here looks fine in console
          resolve(data.contents); // Use the function resolve.
        });

        // Use the function reject for any errors.
    }); 
}

【讨论】:

    【解决方案2】:

    您应该返回一个 Promise 以使您的异步函数实际上可以等待。像这样:

    getGoogleResults = async () => {
        return new Promise((resolve, reject) => {
          const googleResultUrl = 'http://www.google.com/search?q=bakery&num=60');
    
          // get only Divs within results that have class of 's'
          $.getJSON(googleResultUrl, (data) => {
            const results = $(data.contents).find('div[class="g"]');
            const divs = results.find('div[class="s"]');
            console.log(data.contents); // data logged here looks fine in console
            resolve(data.contents); 
          }); //TODO call reject() on error
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 2022-01-21
      • 2021-05-29
      • 2021-08-02
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多