【问题标题】:Using async requires async function, but my function is async使用 async 需要 async 函数,但我的函数是 async
【发布时间】:2021-04-10 21:48:28
【问题描述】:

我正在调整 library that uses callback 以使用 Promises。当我使用then() 时它可以工作,但是当我使用await 时它不起作用。

> dbc.solve
[AsyncFunction]
> await dbc.solve(img)
await dbc.solve(img)
^^^^^

SyntaxError: await is only valid in async function

dbc.solve 的代码是:

module.exports = DeathByCaptcha = (function() {
  function DeathByCaptcha(username, password, endpoint) {
    ...
  }

  DeathByCaptcha.prototype.solve = async function(img) {
    return new Promise(
      function(resolve, reject) {
        ...
      }
    );
  };
})();

我相信这与solveprototype 的成员这一事实有关,但我找不到任何有关它的信息。我发现那个节点没有always supported async await for class methods,所以我从节点7升级,现在我使用的是节点9.4.0。

【问题讨论】:

    标签: javascript promise async-await


    【解决方案1】:

    您没有正确阅读该错误消息:问题不在于您正在调用的函数,而是您中的函数。

    你可以这样做

    (async function(){
        await dbc.solve(img);
        // more code here or the await is useless
    })();
    

    请注意,在节点的 REPL 中应该很快就不再需要这个技巧了:https://github.com/nodejs/node/issues/13209

    【讨论】:

    • 谢谢! in 不是模棱两可吗?它说await is only valid in async function,但“函数”可以是上下文或我正在调用的函数。
    • @rodorgas 这很棘手,我们中的大多数人都被骗过一次,但如果你足够谨慎,我认为这不是模棱两可的。而且我没有看到任何明显更好的信息。
    【解决方案2】:

    SyntaxError: await is only valid in async function - 就像错误告诉您的那样,您只能在标记为async 的函数中使用await。所以你不能在其他任何地方使用 await 关键字。

    https://basarat.gitbooks.io/typescript/docs/async-await.html

    https://www.typescriptlang.org/docs/handbook/release-notes/typescript-1-7.html

    例子:

    function test() {
      await myOtherFunction() // NOT working
    }
    
    async function test() {
      await myOtherFunction() //working
    }
    

    你也可以做匿名回调函数async:

    myMethod().then(async () => {
      await myAsyncCall()
    })
    

    【讨论】:

      【解决方案3】:

      await 运算符只能在中使用异步函数。

      【讨论】:

        【解决方案4】:

        你可能真的不需要async await 抽象。你为什么不简单地用类似的promisifier 来promisify dbc.solve() 函数;

        function promisify(f){
          return data => new Promise((v,x) => f(data, (err, id, sol) => err ? x(err) : v({i:id, s:solution})));
        }
        

        您将获得您的dbc.solve() 的承诺版本,如果它没有引发错误,您将在then 阶段返回一个类似{i:id, s: solution} 的对象。

        【讨论】:

          猜你喜欢
          • 2018-03-27
          • 2021-08-06
          • 1970-01-01
          • 2017-02-28
          • 1970-01-01
          • 2020-08-01
          • 2019-10-04
          • 1970-01-01
          相关资源
          最近更新 更多