我正在调整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) {
...
}
);
};
})();
我认为这与事件solve
是prototype
的成员有关,但我找不到任何有关它的信息。我发现该节点没有always supported async await for class methods,所以我从节点7升级,现在我正在使用节点9.4.0。
答案 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
阶段。