4

我们已经在节点应用程序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代码扩展会自动标记这些扩展会花多少功夫? (如果有人能指出我正确的方向,我就可以解决问题了)。

+0

该功能是否需要异步?它有什么收益吗? (getUsers) –

+2

你在这个项目中使用打字稿吗?如果是这样,它应该在编译时捕获该错误,因为类型'Promise '没有属性“长度”。 – CRice

+0

@因为Promise没有属性“长度”,所以你的工作方式是“users.length”,但如果你忘记等待一个没有返回值的异步函数,那么Typescript将不会帮助你使用这个机制。有谁知道是否有可以检测到异步函数调用的Typescript设置(或其他linter),您不会等待并将它们标记为可能的错误(您可以使用指令仅在您想启动异步工作时显式忽略而不是等待它)? –

回答

3

打字稿已经这样做了

// 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); 
0

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

相关问题