私が理解したことから、非同期コードを呼び出すには3つの方法があります。
- イベント、例えば
request.on("event", callback);
- コールバック、例
fs.open(path, flags, mode, callback);
- 約束
node-promiseライブラリを見つけましたが、見つかりません。
誰かが約束とは何か、なぜ私がそれを使うべきなのか説明してもらえますか?
また、なぜNode.jsから削除されたのですか?
私が理解したことから、非同期コードを呼び出すには3つの方法があります。
request.on("event", callback);
fs.open(path, flags, mode, callback);
node-promiseライブラリを見つけましたが、見つかりません。
誰かが約束とは何か、なぜ私がそれを使うべきなのか説明してもらえますか?
また、なぜNode.jsから削除されたのですか?
この質問にはまだ多くの見解があります(私のように)ので、私はそれを指摘したいと思いました:
node.jsのPromisesは、いくつかの作業を行うことを約束し、その後、成功と失敗、およびタイムアウトの処理のために実行される個別のコールバックを持っていました。node.jsのpromiseを考える別の方法は、成功とエラーの2つのイベントのみを発行できるエミッターであるというものでした。
Promiseの優れた点は、それらを依存関係チェーンに結合できることです(PromiseAとPromiseBが完了した場合にのみPromiseCを実行します)。
それらをコアnode.jsから削除することで、コアの上に置くことができるPromiseのさまざまな実装でモジュールを構築する可能性が生まれました。これらのいくつかは、ノードの約束と先物です。
約束とは、いわば手術の「最終的な」結果を表す「もの」です。ここで注意すべき点は、何かが起こったときの詳細を抽象化し、何かが起こった後に何が起こるべきかに焦点を当てることができるということです。これにより、クリーンで保守可能なコードが作成され、コールバック内のコールバック内にコールバックを含める代わりに、コードは次のようになります。
var request = new Promise(function(resolve, reject) {
//do an ajax call here. or a database request or whatever.
//depending on its results, either call resolve(value) or reject(error)
//where value is the thing which the operation's successful execution returns and
//error is the thing which the operation's failure returns.
});
request.then(function successHandler(result) {
//do something with the result
}, function failureHandler(error) {
//handle
});
約束の仕様は、約束の
then
メソッドは、指定されたsuccessHandlerまたはfailureHandlerコールバックが終了したときに満たされる新しいpromiseを返す必要があります。これは、実行する必要のある一連の非同期タスクがある場合にPromiseを連鎖させ、コールバックを使用した場合と同じように操作の順序付けが保証されることを意味します。したがって、コールバック内のコールバック内にコールバックを渡す代わりに、チェーンされたpromiseを持つコードは次のようになります。
var doStuff = firstAsyncFunction(url) {
return new Promise(function(resolve, reject) {
$.ajax({
url: url,
success: function(data) {
resolve(data);
},
error: function(err) {
reject(err);
}
});
};
doStuff
.then(secondAsyncFunction) //returns a promise
.then(thirdAsyncFunction); //returns a promise
約束とそれがとてもクールな理由についてもっと知るには、Domenicのブログをチェックしてください:http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/
PouchDBの作者によるPromisesに関するこの新しいチュートリアルは、おそらく私がどこでも見た中で最高のものです。それは、正しい使用パターンと、他のチュートリアルでもまだ一般的に使用されているいくつかのアンチパターンを示す古典的な新人の間違いを賢くカバーしています!!
楽しみ!
PS他の人によく取り上げられているので、この質問の他の部分には答えませんでした。
Mike Taultyには、WinJSPromiseライブラリがどのように機能するかを説明する一連のビデオがあります。各ビデオの長さは10分未満です。
これらのビデオは非常に有益であり、Mikeはいくつかの適切に選択されたコード例を使用してPromiseAPIのパワーを示すことができます。
var twitterUrl = "http://search.twitter.com/search.json?q=windows";
var promise = WinJS.xhr({ url: twitterUrl });
promise = promise.then(
function (xhr) {
},
function (xhr) {
// handle error
});
例外の処理方法の扱いは特に優れています。
WinJの参照にもかかわらず、Promise APIは多くの実装で広く類似しているため、これは一般的な関心のあるビデオシリーズです。
RSVPは、Promise /A+テストスイートに合格する軽量のPromise実装です。WinJSインターフェースとスタイルが似ているので、私はAPIがとても好きです。
2014年4月更新
ちなみに、WinJSライブラリは現在オープンソースです。
promiseのもう1つの利点は、エラー処理と例外のスローとキャッチが、コールバックで処理しようとするよりもはるかに優れていることです。
bluebirdライブラリは、 promiseを実装し、非常に長いスタックトレースを提供し、非常に高速で、キャッチされていないエラーについて警告します。また、 http://bluebirdjs.com/docs/benchmarks.htmlによると、他のPromiseライブラリよりも高速でメモリの使用量も少なくなっています。
Promiseとは正確には何ですか?
promiseは、非同期操作の結果を表す単なるオブジェクトです。約束は、次の3つの状態のいずれかになります。
保留中::これは初期状態であり、約束が履行も拒否もされていないことを意味します。
履行済み::これは、promiseが履行されたことを意味し、promiseで表される値を使用する準備ができていることを意味します。
拒否::これは、操作が失敗したため、約束を果たすことができないことを意味します。州とは別に、私たちが本当に理解する必要がある約束に関連する3つの重要なエンティティがあります
executor関数::executor関数は、実行する必要があり、その結果がpromiseによって表される非同期操作を定義します。promiseオブジェクトが初期化されるとすぐに実行を開始します。
resolve :: resolveは、エグゼキュータ関数に渡されるパラメータです。エグゼキュータが正常に実行された場合、このリゾルブは結果の受け渡しと呼ばれます。
リジェクト::リジェクトはエグゼキュータ関数に渡される別のパラメータであり、エグゼキュータ関数が失敗したときに使用されます。失敗の理由は拒否に渡すことができます。
したがって、promiseオブジェクトを作成するときは常に、Executor、Resolve、およびRejectを提供する必要があります。
参照::約束
最近、node.jsのpromiseも調べています。これまでのところ、when.jsはその速度とリソースの使用のために進むべき道のようですが、q.jsのドキュメントは私にはるかに良い理解を与えてくれました。したがって、when.jsを使用しますが、q.jsドキュメントを使用して主題を理解します。
githubのq.jsreadmeから:
関数がブロックせずに値を返したり例外をスローしたりできない場合は、代わりにpromiseを返すことができます。promiseは、関数が最終的に提供する可能性のある戻り値またはスローされた例外を表すオブジェクトです。Promiseは、遅延を克服するためのリモートオブジェクトのプロキシとしても使用できます。
Promiseオブジェクトは、非同期操作の完了または失敗を表します。
したがって、promiseを実装するには、次の2つの部分が必要です。-
1.プロミスの作成:
promiseコンストラクターは、2つのパラメーターresolveとrejectを持つexecutorと呼ばれる関数を受け入れます。
function example(){ return new Promise (function(resolve , reject){ //return promise object if(success){ resolve('success'); //onFullfiled }else{ reject('error'); //onRejected } }) }
2.約束の処理:
Promiseオブジェクトには、Promiseオブジェクトを処理するための3つのメソッドがあります。-
1.Promise.prototype.catch(onRejected)
2.Promise.prototype.then(onFullfiled)
3.Promise.prototype.finally(onFullfiled、onRejected)
example.then((data) =>{ //handles resolved data console.log(data); //prints success }).catch((err) => { //handles rejected error console.log(err); //prints error })