今回は、Node Async/Await 非同期プログラミングを最適化する方法と、Node Async/Await 非同期プログラミングを最適化する際の注意点について説明します。実際のケースを見てみましょう。
1. 非同期プログラミングの究極のソリューション
数日前、私は javascript 非同期操作についての記事「JavaScript Promise の詳細な説明」を書きました。最近、Puppeteer を勉強しているときに別の非同期プログラミング ソリューションを発見しました。 Async/Await.
非同期操作は JavaScript プログラミングにおける厄介な問題であり、この問題を解決するためにさまざまな解決策を提案している人もいます。 最初のコールバック関数から、Promiseのオブジェクト、そしてGenerator関数に至るまで、毎回改良が加えられていますが、不完全なように感じます。 これらはすべてさらに複雑であり、抽象化の基礎となる動作メカニズムを理解する必要があります。
Async 関数が登場した後、これが非同期プログラミングの究極の解決策であると考える人もいました。 Async/Await を使用すると、非同期プログラミングかどうかを気にする必要がないからです。
2. 基本的な使い方
async 関数は Promise オブジェクトを返します。then メソッドを使用してコールバック関数を追加できます。 関数の実行時に await が発生すると、最初に戻り、トリガーされた非同期操作が完了するまで待機してから、関数本体内の後続のステートメントを実行します。
以下は栗です:
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(); }, time); }) }; var start = async function () { // 在这里使用起来就像同步代码那样直观 console.log('start'); await sleep(3000); console.log('end'); }; start();
上記のコードを実行すると、コンソールに最初にstartが出力され、3秒待った後にendが出力されることが分かります。
3. 注意事項
1. await コマンドは非同期関数でのみ使用できます。通常の関数で使用するとエラーが報告されます。async function dbFuc(db) { let docs = [{}, {}, {}]; // 报错 docs.forEach(function (doc) { await db.post(doc); }); }
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { // 返回 ‘ok' resolve('ok'); }, time); }) }; var start = async function () { let result = await sleep(3000); console.log(result); // 收到 ‘ok' };
async function dbFuc(db) { let docs = [{}, {}, {}]; // 可能得到错误结果 docs.forEach(async function (doc) { await db.post(doc); }); }
async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = await Promise.all(promises); console.log(results); }
4. エラーキャッチ
.then(..) を記述する必要がないため、標準の try catch 構文を直接使用できます。エラーをキャッチするため。var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { // 模拟出错了,返回 ‘error' reject('error'); }, time); }) }; var start = async function () { try { console.log('start'); await sleep(3000); // 这里得到了一个返回错误 // 所以以下代码不会被执行了 console.log('end'); } catch (err) { console.log(err); // 这里捕捉到错误 `error` } };
React が React-router ルーティングでログイン検証制御を実装する方法
Angular ルーティングでルーティング ガードを使用する方法
以上がノードの Async/Await 非同期プログラミングを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。