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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-05-16 16:29:191552ブラウズ

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

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 までご連絡ください。