ビジネスのシナリオを想定してください:
RSSアドレスを介して、RSSを取得してファイルに保存すると、RSSアドレスがファイルに保存されます。
このシナリオでビジネスを完了するには、3つのタスクが必要です。
1.ファイルからRSSアドレスを読み取ります。
2。RSSを取得します。
3.ファイルを保存します。
最後に、これらの3つのタスクが統合されています。
準備する:
RSSアドレス、address.txtを保存するファイル。
http://programmer.csdn.net/rss_programmer.html
タスク1:
RSSアドレスファイルのコンテンツを読み、コールバックを介して返されます。
コードコピーは次のとおりです。
var getrssaddress = function(path、callback){
fs.readfile(path、{encoding: 'utf8'}、function(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){
データ += chrunk;
});
res.on( 'end'、function(){
コールバック(null、data);
});
})。on( 'error'、function(err){
コールバック(err、null);
});
}
タスク3:
RSSをファイルに保存し、コールバックでエラーを返します。
コードコピーは次のとおりです。
var saverss = function(data、callback){
fs.writefile( 'rss.txt'、data、 'utf8'、function(err){
コールバック(err);
});
}
統合:
コードコピーは次のとおりです。
getrssaddress( 'address.txt'、function(err、data){
if(err){
console.log(err);
戻る;
}
getrss(data、function(err、data){
if(err){
console.log(err);
戻る;
}
Saverss(data、function(err){
if(err)console.log(err);
});
});
});
上記のコードは完全に非同期処理です。最も一般的なコールバックは、非同期ロジックのリターンを処理するために使用されます。利点は、標準の執筆方法が誰もが簡単に受け入れることができることです。不利な点は、結合が強すぎることです。例外の取り扱いは、特に複雑なビジネスロジックと多くのタスクを扱う場合、レイヤー化されたコールバックを維持するのが難しく、コードを維持するのが難しくなります。
Promise/A仕様の実装の1つは、そのような問題ドメインを対象としたwhen.jsです。
変更されたコードを見てみましょう。
タスク1:
コードコピーは次のとおりです。
var getrssaddress = function(path){
var deferred = when.defer();
fs.readfile(path、{encoding: 'utf8'}、function(err、data){
if(err)deferred.reject(err);
deferred.resolve(data);
});
deferred.promiseを返します。
}
タスク2:
コードコピーは次のとおりです。
var getrss = function(url){
var deferred = when.defer();
var data = '';
http.get(url、function(res){
res.on( 'data'、function(chrunk){
データ += chrunk;
});
res.on( 'end'、function(){
deferred.resolve(data);
});
})。on( 'error'、function(err){
deferred.reject(err);
});
deferred.promiseを返します。
}
タスク3:
コードコピーは次のとおりです。
var Saverss = function(data){
var deferred = when.defer();
fs.writefile( 'rss.txt'、data、 'utf8'、function(err){
if(err)deferred.reject(err);
deferred.resolve();
});
deferred.promiseを返します。
}
統合:
コードコピーは次のとおりです。
getrssaddress( 'address.txt')
.then(getrss)
.then(saverss)
.catch(function(err){
console.log(err);
});
説明する:
Promise/A仕様によって定義される「延期/約束」モデルは、「パブリッシュ/サブスクライバー」モデルです。延期されたオブジェクトを介したイベントの公開は、完了解決イベントまたは失敗した拒否イベントになる可能性があります。対応する完了または故障したサブスクリプションは、Promiseオブジェクトを介して行われます。
約束/仕様では、各タスクには3つの状態があります。デフォルト(保留中)、満たされた(満たされた)、失敗(拒否)。
1.デフォルトの状態は、一方向に完了状態に転送できます。このプロセスはResolveと呼ばれ、対応する方法は延期されます。
2。デフォルトの状態は、故障状態に一方向に転送することもできます。このプロセスは拒否と呼ばれ、対応する方法は延期されます。
3。デフォルトの状態では、deferred.notify(更新)を介してタスク実行情報を宣言することもできます。
4.状態移転は1回限りです。タスクが最初の保留中から他の状態に変更されると、次のタスクの実行プロセスに入力されます。
上記のコードに従ってください。
when.deferを介して延期されたオブジェクトを定義します。
var deferred = when.defer();
非同期データが正常に取得された後、完了イベントが公開されます。
deferred.resolve(data);
非同期データ収集が失敗した後、失敗したイベントが公開されます。
deferred.reject(err);
Promiseオブジェクトをサブスクリプションとして返します。
deferred.promiseを返します。
サブスクリプションは、PromiseオブジェクトのThen Methodを介して完了/失敗/通知されるサブスクリプションです。
getrssaddress( 'address.txt')
.then(getrss)
次に、3つのパラメーターがあります。
Promise.then(onfulfiled、onlejected、onprogress)
以前のタスクは解決(データ)であり、OnfulFilled関数がトリガーされ、データがそのパラメーターとして使用されます。
以前のタスクが拒否された場合(理由)、redectedがトリガーされ、理由が受信されます。
いつでも、整理されたものと延期されたうちの1つだけがトリガーされ、1回だけです。
例外を処理するために、when.jsは非常に便利な方法も提供します。その後、エラーを渡すことができます。複数のタスクが連続して実行されると、最後に削除されたもののみを定義できます。また、最後の後にキャッチ関数を呼び出して、タスクの例外をキャッチすることもできます。
これは、それを書くためのシンプルで明確な方法です。
コードコピーは次のとおりです。
getrssaddress( 'address.txt')
.then(getrss)
.then(saverss)
.catch(function(err){
console.log(err);
});
約束は非同期プログラミングに大きな利便性をもたらし、ピラミッドの不幸に陥ることなく単一のタスクの実装に集中できるようにします。上記のコードは基本的な使用のみです。 when.jsは、この記事に記載されている機能よりもはるかに多くを提供します。詳細については、公式APIを参照してください。