如何在Node + Typescript + VSCode中查找Async函数调用时缺少的等待状态?
问题描述:
我们已经在节点应用程序b/c中部署了错误,我们忘记用“await”作为前缀异步函数调用。如何在Node + Typescript + VSCode中查找Async函数调用时缺少的等待状态?
例子:
const getUsers = async() => db.query('SELECT * from Users');
const testMissingAwait = async() => {
const users = getUsers(); // <<< missing await
console.log(users.length);
};
testMissingAwait();
有一种简单的方法来找到异步函数调用缺少的await关键字?
如果失败了,编写一个Visual Studio代码扩展会自动标记这些扩展会花多少功夫? (如果有人能指出我正确的方向,我就可以解决问题了)。
答
打字稿已经这样做了
// users is a Promise<T>
const users = getUsers(); // <<< missing await
// users.length is not a property of users... then and catch are
console.log(users.length);
你可以找到在那里你会不会告诉你错误的情况 - 在类型是兼容的,例如我在这里错过了的await:
function delay(ms: number) {
return new Promise<number>(function(resolve) {
setTimeout(() => {
resolve(5);
}, ms);
});
}
async function asyncAwait() {
let x = await delay(1000);
console.log(x);
let y = delay(1000);
console.log(y);
return 'Done';
}
asyncAwait().then((result) => console.log(result));
由于console.log
不会导致我的数字和我的承诺之间的任何类型不兼容,编译器不能告诉我犯了一个错误。
这里唯一的解决方案是一个类型注释...但是如果你会忘记等待,你可能会忘记类型注释。
let y: number = delay(1000);
答
TypeScript编译器不提供编译器选项。但是,TSLint 4.4提供了检测浮动许诺的选项。
tslint --project tsconfig.json
如果有浮动:你可以阅读这篇博客文章更详细的解答:Detect missing await in typescript
下载TSLint:
npm install -g tslint typescript
配置TSLint:
{
"extends": "tslint:recommended",
"rules": {
"no-floating-promises": true
}
}
运行TSLint在您的代码中承诺,您应该看到以下错误:
ERROR: F:/Samples/index.ts[12, 5]: Promises must be handled appropriately
该功能是否需要异步?它有什么收益吗? (getUsers) –
你在这个项目中使用打字稿吗?如果是这样,它应该在编译时捕获该错误,因为类型'Promise'没有属性“长度”。 –
CRice
@因为Promise没有属性“长度”,所以你的工作方式是“users.length”,但如果你忘记等待一个没有返回值的异步函数,那么Typescript将不会帮助你使用这个机制。有谁知道是否有可以检测到异步函数调用的Typescript设置(或其他linter),您不会等待并将它们标记为可能的错误(您可以使用指令仅在您想启动异步工作时显式忽略而不是等待它)? –