4

私たちはノードアプリケーションにバグを導入しましたが、非同期関数呼び出しの前に "await"を付けることを忘れました。Node + Typescript + VSCodeの非同期関数呼び出しでAwaitが見つからない場合はどうすればよいですか?

例:

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 'の型は 'length'というプロパティを持たないので、コンパイル時にそのエラーをキャプチャしたはずです。 – CRice

+0

@CRiceプロンプトに 'length'というプロパティがないため、 "users.length"を実行すると動作しますが、戻り値のない非同期関数を待つのを忘れた場合、Typescriptはこの仕組みを手助けしません。誰かが、あなたが待機していない非同期関数呼び出しを検出し、それらを可能なエラーとしてフラグを立てるTypescript設定(または他のリンター)があるかどうかを知っていますか?(非同期作業を始めるときだけ明示的に無視するよう指示それを待たずに)? –

答えて

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

関連する問題