使用async需要异步功能,但我的功能是异步的

时间:2018-02-08 12:56:41

标签: javascript promise async-await

我正在调整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。

4 个答案:

答案 0 :(得分:13)

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

你可以做

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

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

答案 1 :(得分:6)

SyntaxError: await is only valid in async function - 就像错误告诉您的那样,您只能在标记为await的函数中使用async。因此,您无法在其他地方使用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()
})

答案 2 :(得分:3)

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

答案 3 :(得分:2)

您可能不需要async await抽象。为什么不简单地使用类似的promisifier宣传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()的有效版本,如果它没有触发错误,您将返回{i:id, s: solution}之类的对象then阶段。