ホームページ  >  記事  >  ウェブフロントエンド  >  ノードの Async/Await 非同期プログラミングを最適化する方法

ノードの Async/Await 非同期プログラミングを最適化する方法

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-30 14:52:041131ブラウズ

今回は、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);
 });
}
2. Await は、実行を続行する前に、Promise が結果を返すのを待つことを意味します。

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'
};
3. await の後には Promise オブジェクトが続く必要があります。

コードが同期的に実行される場合、変更を待つ必要はありません。

4. await はネイティブ構文でのみ使用できます。たとえば、forEeach 構造で await を使用すると、for ループのネイティブ構文を使用する必要があります。

async function dbFuc(db) {
 let docs = [{}, {}, {}];
 // 可能得到错误结果
 docs.forEach(async function (doc) {
  await db.post(doc);
 });
}
複数のリクエストを同時に実行したい場合は、Promise.all メソッドを使用できます。

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`
  }
};
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

React が React-router ルーティングでログイン検証制御を実装する方法

Angular ルーティングでルーティング ガードを使用する方法

以上がノードの Async/Await 非同期プログラミングを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。