ホームページ  >  記事  >  ウェブフロントエンド  >  ノードAsync/Await非同期プログラミング実装の詳細説明

ノードAsync/Await非同期プログラミング実装の詳細説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-22 11:46:302034ブラウズ

今回は、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 サイトの他の関連記事に注目してください。

推奨読書:

Vue の計算プロパティとリスナーのケース コード分析


vuex とコンポーネントを一緒に使用する手順の詳細な説明

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

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