ホームページ ウェブフロントエンド jsチュートリアル node.js_node.js での when.js の非同期プログラミングの実践

node.js_node.js での when.js の非同期プログラミングの実践

May 16, 2016 pm 04:29 PM
node.js 非同期プログラミング

ビジネス シナリオを想定します:

RSS アドレスから RSS を取得し、ファイルに保存すると、RSS アドレスがファイルに保存されます。

このシナリオのビジネスを完了するには、3 つのタスクを完了する必要があります:

1. ファイルから RSS アドレスを読み取ります。

2. RSSを取得します。

3. ファイルに保存します。

最後に、これら 3 つのタスクを統合します。

準備:

RSS アドレスを保存するファイル、address.txt。

http://programmer.csdn.net/rss_programmer.html

タスク 1:

RSS アドレス ファイルの内容を読み取り、コールバックを通じて返します。

コードをコピーします コードは次のとおりです:

var getRssAddress = 関数(パス, コールバック) {
fs.readFile(path, {エンコーディング: 'utf8'}, 関数 (err, data) {
callback(err, data);
});
}

ミッション 2:

RSS アドレスを通じて RSS を取得し、コールバックを通じてエラーまたはデータを返します。

コードをコピーします コードは次のとおりです:

var getRss = function(url, callback) {
var data = '';
http.get(url, function(res) {
res.on('data', function(chrunk) {
データ = チャンク;
});
res.on('end', function() {
callback(null, data);
});
}).on('エラー', function(err) {
コールバック(err, null);
});
}

ミッション 3:

RSS をファイルに保存し、コールバックを通じてエラーを返します。

コードをコピーします コードは次のとおりです:

var saveRss = function(data, callback) {
fs.writeFile('rss.txt', data, 'utf8', function(err) {
コールバック(エラー);
});
}

統合:

コードをコピーします コードは次のとおりです:

getRssAddress('address.txt', function(err, data) {
if(err) {
console.log(err);
戻る;
}
getRss(データ, 関数(エラー, データ) {
If(err) {
console.log(err);
戻る;
}
SaveRss(data, function(err) {
If(err) console.log(err);
});
});
});

上記のコードは、最も一般的なコールバックを使用して非同期ロジックの戻りを処理する完全な非同期処理です。利点は、誰もが簡単に受け入れられる標準的な記述方法であることです。欠点は、結合が強すぎることです。例外の処理は面倒で、コードは直感的ではありません。特に複雑なビジネス ロジックや複数の処理タスクを扱う場合、コールバックの層が人々の目を眩ませる可能性があり、コードの保守が困難になります。

Promise/A 仕様の実装の 1 つである

when.js は、この問題領域を対象としています。

変換されたコードを見てみましょう。

ミッション 1:

コードをコピーします コードは次のとおりです:

var getRssAddress = 関数(パス) {
var deferred = when.defer();
fs.readFile(path, {エンコーディング: 'utf8'}, function (err, data) {
If (err) deferred.reject(err);
deferred.resolve(data);
});

return deferred.promise;
}



ミッション 2:

コードをコピー コードは次のとおりです:

var getRss = 関数(url) {
  var deferred = when.defer();
    var data = '';
    http.get(url, function(res) {
      res.on('data', function(chrunk) {
        データ = チャンク;
      });
      res.on('end', function() {
        deferred.resolve(data);
      });
    }).on('エラー', function(err) {
      deferred.reject(err);
    });

return deferred.promise;
}

任务3:

复制代 代码如下:

var saveRss = 関数(データ) {
  var deferred = when.defer();
  fs.writeFile('rss.txt', data, 'utf8', function(err) {
    if(err) deferred.reject(err);
    deferred.resolve();
  });

return deferred.promise;
}


 

統合:

复制代 代码如下:

getRssAddress('address.txt')
  .then(getRss)
  .then(saveRss)
  .catch(関数(エラー) {
    console.log(err);
  });

解释:

promise/A 定義の「Deferred/Promise」モデルは、「発行/承認者」モデルであり、Deferred オブジェクトを介して配布イベントを実行することも、完了解決イベントであることも、失敗拒否イベントであることもできます。Promise オブジェクトを介して完了または失敗を実行することもできます

約束/A 承認では、各仕事には 3 つの状態があります: 承認 (保留中)、完了 (履行)、失敗 (拒否)。

1. 承認状態は完了状態に一方的に移行でき、この手順は解決されます。対応するメソッドは deferred.resolve(promiseOrValue) です。

2. 承認状態は失効状態に一方的に移行することもでき、この手続きは拒否され、対応方法は deferred.reject(reason) です。

3. 承認状態の場合、deferred.notify(update) を介して宣告任务行情報、例として実行することもできます。

4. 状態の移行は 1 回限りであり、最初の保留中のタスクが他の状態に移行すると、次のタスクの実行プロセスに入ります。

上記のコードを参照してください。

when.defer によって遅延オブジェクトが 1 つ定義されます。

var deferred = when.defer();

データの取得に成功すると、完了イベントが送信されます。

deferred.resolve(data);
データの取得が失われると、損失イベントが送信されます。

deferred.reject(err);

そして、承認として使用される Promise オブジェクトを返します。
return deferred.promise;

は、Promise オブジェクトの then メソッドによって完了/失効/通知を実行する承認です。
getRssAddress('address.txt')

  .then(getRss)

次に、3 つのパラメータがあり、それぞれ onFulfilled、onRejected、onProgress
になります。

promise.then(onFulfilled、onRejected、onProgress)

上のタスクは resolve(data) され、onFulfilled 関数がトリガーされ、data がパラメータとして使用されます。

上のジョブが拒否されました (理由)。拒否された場合は理由が通知されます。

いつでも、onFulfilled と onRejected のどちらか一方のみを起動でき、一度だけ起動できます。

頻繁に処理する場合、.js もその便利な方法を提供しており、複数のタスクが連続して実行されるときに、最後の 1 つの時点でのみ拒否を設定できます。 catch 関数は、任意のジョブの例外を捕捉します。
このように書き込み方法は完了しました。

复制代

代码如下:

getRssAddress('address.txt')   .then(getRss)   .then(saveRss)   .catch(関数(エラー) {     console.log(err);   });


約束は巨大な方法を提供し、入金字塔厄运を避けるために、私は単一の仕事の実行に参加することができます、以上の代価のみが基本的に使用されます、when.js が提供する機能はここに記載されていますこれらは、具体的には官方 API を参照します。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C++ 関数を使用して非同期プログラミングを実装するにはどうすればよいですか? C++ 関数を使用して非同期プログラミングを実装するにはどうすればよいですか? Apr 27, 2024 pm 09:09 PM

概要: C++ の非同期プログラミングを使用すると、時間のかかる操作を待たずにマルチタスクを行うことができます。関数ポインターを使用して、関数へのポインターを作成します。コールバック関数は、非同期操作が完了すると呼び出されます。 boost::asio などのライブラリは、非同期プログラミングのサポートを提供します。実際のケースでは、関数ポインターと boost::asio を使用して非同期ネットワーク リクエストを実装する方法を示します。

ReactPHP を使用して PHP で非同期プログラミングを行う方法 ReactPHP を使用して PHP で非同期プログラミングを行う方法 Jun 27, 2023 am 09:14 AM

Web アプリケーションがより複雑になるにつれて、プログラマは大量のリクエストや I/O 操作を処理するために非同期プログラミングを採用する必要があります。 PHP: HypertextPreprocessor も例外ではありません。このニーズを満たすために、ReactPHP は PHP の最も人気のある非同期プログラミング フレームワークの 1 つになりました。この記事では、ReactPHP を使用して PHP で非同期プログラミングを行う方法について説明します。 1. ReactPHP の概要 ReactPHP はイベント駆動型プログラミングです。

JavaScript 関数の非同期プログラミング: 複雑なタスクを処理するための重要なヒント JavaScript 関数の非同期プログラミング: 複雑なタスクを処理するための重要なヒント Nov 18, 2023 am 10:06 AM

JavaScript 関数の非同期プログラミング: 複雑なタスクを処理するための必須スキル はじめに: 最新のフロントエンド開発では、複雑なタスクを処理することが不可欠な部分になっています。 JavaScript 関数の非同期プログラミング スキルは、これらの複雑なタスクを解決する鍵となります。この記事では、JavaScript 関数の非同期プログラミングの基本概念と一般的な実践的な方法を紹介し、読者がこれらのテクニックをよりよく理解して使用できるように、具体的なコード例を示します。 1. 非同期プログラミングの基本概念 従来の同期プログラミングでは、コードは次のようになります。

PHP で非同期メッセージ処理を実装する方法 PHP で非同期メッセージ処理を実装する方法 Jul 10, 2023 am 08:19 AM

PHP で非同期メッセージ処理を実装する方法 はじめに: 最新の Web アプリケーションでは、非同期メッセージ処理がますます重要になってきています。非同期メッセージ処理により、システムのパフォーマンスとスケーラビリティが向上し、ユーザー エクスペリエンスが向上します。一般的に使用されるサーバー側プログラミング言語である PHP は、いくつかのテクノロジを通じて非同期メッセージ処理を実装することもできます。この記事では、PHP で非同期メッセージ処理を実装するいくつかの方法を紹介し、コード例を示します。メッセージ キューの使用 メッセージ キューは、システム コンポーネントを分離する方法であり、さまざまなコンポーネントが相互に接続できるようにします。

PHP8 の新機能を深く理解する: 非同期プログラミングとコードを効率的に使用するにはどうすればよいですか? PHP8 の新機能を深く理解する: 非同期プログラミングとコードを効率的に使用するにはどうすればよいですか? Sep 11, 2023 pm 01:52 PM

PHP8 の新機能を深く理解する: 非同期プログラミングとコードを効率的に使用するにはどうすればよいですか? PHP8 は PHP プログラミング言語の最新メジャー バージョンであり、多くのエキサイティングな新機能と改善をもたらします。最も顕著な機能の 1 つは、非同期プログラミングのサポートです。非同期プログラミングを使用すると、同時タスクを処理するときのパフォーマンスと応答性を向上させることができます。この記事では、PHP8 の非同期プログラミング機能を詳しく説明し、それらを効率的に使用する方法を紹介します。まず、非同期プログラミングとは何かを理解しましょう。従来の同期プログラミング モデルでは、コードは線形シーケンスに従います。

Java フレームワークでの非同期プログラミングにおける一般的な問題と解決策 Java フレームワークでの非同期プログラミングにおける一般的な問題と解決策 Jun 04, 2024 pm 05:09 PM

Java フレームワークでの非同期プログラミングにおける 3 つの一般的な問題と解決策: コールバック地獄: Promise または CompletableFuture を使用して、より直感的なスタイルでコールバックを管理します。リソースの競合: 同期プリミティブ (ロックなど) を使用して共有リソースを保護し、スレッドセーフなコレクション (ConcurrentHashMap など) の使用を検討します。未処理の例外: タスク内の例外を明示的に処理し、例外処理フレームワーク (CompletableFuture.Exceptionally() など) を使用して例外を処理します。

golang フレームワークは同時実行性と非同期プログラミングをどのように処理しますか? golang フレームワークは同時実行性と非同期プログラミングをどのように処理しますか? Jun 02, 2024 pm 07:49 PM

Go フレームワークは Go の同時実行性と非同期機能を使用して、同時タスクと非同期タスクを効率的に処理するためのメカニズムを提供します。 1. 同時実行性は Goroutine によって実現され、複数のタスクを同時に実行できます。 2. 非同期プログラミングはチャネルを通じて実装されます。メインスレッドをブロックせずに実行可能。 3. HTTP リクエストの同時処理、データベース データの非同期取得などの実用的なシナリオに適しています。

JSのAI時代が到来! JSのAI時代が到来! Apr 08, 2024 am 09:10 AM

JS-Torch の概要 JS-Torch は、構文が PyTorch に非常に似ている深層学習 JavaScript ライブラリです。これには、完全に機能するテンソル オブジェクト (追跡された勾配で使用可能)、深層学習レイヤーと関数、および自動微分エンジンが含まれています。 JS-Torch は JavaScript での深層学習の研究に適しており、深層学習の開発を加速するための便利なツールや機能を多数提供します。 Image PyTorch は、Meta の研究チームによって開発および保守されているオープンソースの深層学習フレームワークです。ニューラル ネットワーク モデルを構築およびトレーニングするための豊富なツールとライブラリのセットを提供します。 PyTorch は、シンプル、柔軟、そして使いやすいように設計されており、その動的な計算グラフ機能により、

See all articles