使用异步需要异步函数,但我的函数已经是异步的。

9

我正在将一个使用回调的库改为使用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的成员有关,但我找不到任何相关信息。我发现Node.js并非一直支持类方法的异步等待(详情请看这里),所以我从Node.js 7升级到了Node.js 9.4.0。

4个回答

25

你没有正确地读取错误信息:问题不在你调用的函数中,而在你所处的函数中。

你可能会这样做:

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

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


谢谢!“in”不是有歧义吗?它说“await 仅在异步函数中有效”,但是“函数”可以是上下文或我正在调用的函数。 - rodorgas
2
@rodorgas 这很棘手,我们大多数人都曾被骗过一次,但如果你足够谨慎,我认为这并不模糊。我也没有看到任何显然更好的信息。 - Denys Séguret

8

SyntaxError: await只能在async函数中使用 - 正如错误提示所说,你仅可以在标记为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
等待运算符只能在异步函数中使用。

2

您可能真的不需要asyncawait抽象。为什么不使用类似于promisifier的方法简单地将dbc.solve()函数promisify;

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}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接