Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using async requires async function, but my function is async

I'm adapting a library that uses callback to use Promises. It's working when I use then(), but it doesn't work when I use await.

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

SyntaxError: await is only valid in async function

The code for dbc.solve is:

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

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

I believe this has something with the fact solve is member of prototype, but I couldn't find any information about it. I found that node didn't always supported async await for class methods, so I upgraded from node 7, now I'm using node 9.4.0.

like image 261
rodorgas Avatar asked Feb 08 '18 12:02

rodorgas


2 Answers

You don't read that error message right: the problem isn't the function you're calling but the function you're in.

You may do

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

Note that this trick should soon enough not be needed anymore in node's REPL: https://github.com/nodejs/node/issues/13209

like image 184
Denys Séguret Avatar answered Nov 01 '22 19:11

Denys Séguret


SyntaxError: await is only valid in async function - just like the error tells you, you may only use await inside a function which is marked as async. So you cannot use the await keyword anywhere else.

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

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

examples:

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

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

You can also make anonymous callback functions async:

myMethod().then(async () => {
  await myAsyncCall()
})
like image 23
messerbill Avatar answered Nov 01 '22 20:11

messerbill