190*_*ome 8 node.js async-await typescript visual-studio-code vscode-extensions
我们在我们的节点应用程序中部署了错误b/c我们忘了使用"await"为异步函数调用添加前缀.
例:
const getUsers = async () => db.query('SELECT * from Users');
const testMissingAwait = async () => {
const users = getUsers(); // <<< missing await
console.log(users.length);
};
testMissingAwait();
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以找到缺少await关键字的异步函数调用?
如果做不到这一点,编写一个自动标记这些内容的Visual Studio代码扩展会付出多少努力?(如果有人能指出我正确的方向,我正在努力解决).
TypeScript 编译器没有为此提供编译器选项。但是,TSLint 4.4 提供了检测浮动承诺的选项。您可以阅读这篇博文以获得更详细的答案:Detect missing await in typescript
下载 TSLint:
npm install -g tslint typescript
Run Code Online (Sandbox Code Playgroud)
配置 TSLint:
{
"extends": "tslint:recommended",
"rules": {
"no-floating-promises": true
}
}
Run Code Online (Sandbox Code Playgroud)
运行 TSLint:
tslint --project tsconfig.json
Run Code Online (Sandbox Code Playgroud)
如果您的代码中有浮动承诺,您应该看到以下错误:
错误:F:/Samples/index.ts[12, 5]:必须正确处理承诺
TypeScript 已经做到了这一点
// 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);
Run Code Online (Sandbox Code Playgroud)
您可能会遇到不会被告知您的错误的情况 - 类型兼容,例如我在这里错过了等待:
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));
Run Code Online (Sandbox Code Playgroud)
因为console.log不会导致我的数字和我的承诺之间出现任何类型不兼容,所以编译器无法判断我犯了错误。
这里唯一的解决方案是类型注释...但是如果您忘记了等待,您也很可能会忘记类型注释。
let y: number = delay(1000);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1699 次 |
| 最近记录: |