将 ES2017 异步与 jQuery .ready() 一起使用

And*_*ndy 3 javascript jquery asynchronous

我正在学习ES2017 中引入的异步函数功能,但我似乎无法使以下功能正常工作:

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

$(sayHelloAsync);
Run Code Online (Sandbox Code Playgroud)

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

我在 Linux 上使用 Google Chrome 57。

更新

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

And*_*nov 5

UPD:正如 Quentin 提到的,这些问题已经得到解决,并且 jQuery 3.6.0(可能还有一些早期版本)可以按预期工作。

我已经检查了jQuery源代码,下面是它执行的检查以找出参数是什么:

isFunction: function( obj ) {
  return jQuery.type( obj ) === "function";
}
Run Code Online (Sandbox Code Playgroud)

并且jQuery.type( obj )回报object并不function如预期。这可能是 中的一个错误jQuery,但这就是该函数未执行的原因。

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

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

  • 请注意,在 jQuery 3.1.0 和 3.6.0 之间,此错误已得到修复。 (2认同)