如何在Node + Typescript + VSCode的异步函数调用中找到丢失的Await?

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代码扩展会付出多少努力?(如果有人能指出我正确的方向,我正在努力解决).

mez*_*tou 5

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]:必须正确处理承诺


Fen*_*ton 3

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)

  • 仅当您期望 Promise 返回函数返回值时,这才有效。如果您在不将结果分配给变量的情况下调用该函数,但仍然需要“等待”它以确保事情按正确的顺序发生,您将不会收到有关错误的通知。 (2认同)