使用ES2017异步与jQuery .ready()

时间:2017-04-18 13:17:08

标签: javascript jquery asynchronous

我正在了解ES2017中引入的async function功能,而我似乎无法使用以下功能:

async function sayHelloAsync() {
  let {autosave} = await browser.storage.local.get('autosave');
  if (autosave) {
    $('#helloButton').click();
  }
}

$(sayHelloAsync);

我已经在我的小应用程序中为我的需求设置了一个解决方法,但我想知道为什么这不起作用。一旦我删除async,它就会按预期工作。我还有其他使用async函数作为回调的自定义事件绑定,它们工作得很好。

我在Linux上使用Google Chrome 57.

更新

我更新了我的代码示例,以消除我对加载DOM和jQuery的需求的困惑。

3 个答案:

答案 0 :(得分:1)

我已经检查了jQuery源代码,这是一个检查,以确定参数是什么:

isFunction: function( obj ) {
  return jQuery.type( obj ) === "function";
}

jQuery.type( obj )按预期返回object而不是function。这可能是jQuery中的一个错误,但这就是为什么函数没有执行的原因。

挖掘更多,jQuery调用toString.call( obj ) ti确定类型并尝试将结果映射到已知类型。它不能和那就是它返回object的原因。

所以这里的问题是jQuery而不是你的异步函数。

答案 1 :(得分:0)

您可以使用本机js

document.addEventListener( 'DOMContentLoaded',  async function () {});

答案 2 :(得分:0)

似乎 OP 找到了他们问题的答案,但实际上并不是问题标题的答案。我想在使用 jQuery 编写的 Puppeteer 脚本中等待 document.ready 函数。

这就是我的做法;它回答了以下标题的问题:

您可以将 document.ready 函数包装在页面准备就绪时解析的 promise 中。

  //Wrap document ready function in a promise to be able to await it
  async domReady() {
    let promise = new Promise((resolve, reject) => {
      $(document).ready(() => {
        resolve("ready");
      });

      //Any reason for rejection could go here and have a call to reject(error);
    });

    return promise;
  }

那么如果你想等待文档加载:

await domReady();
// The rest of your dependant code goes here...