私が理解したことから、非同期コードを呼び出す方法は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のプロミスはいくつかの作業を行うことを約束しており、成功と失敗、およびタイムアウトの処理のために実行される個別のコールバックがありました。node.jsのプロミスについて考えるもう1つの方法は、プロミスが成功とエラーの2つのイベントのみを発行できるエミッターであるということです。
Promiseのすばらしい点は、Promiseを依存関係チェーンに結合できることです(Promise Cは、Promise A と Promise Bが完了したときにのみ実行してください)。
コアの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には、WinJS Promiseライブラリがどのように機能するかを説明する一連のビデオがあり、それぞれ10分未満です。
これらのビデオは非常に有益であり、Mikeは、いくつかの適切に選択されたコード例を使用して、Promise APIの力を示しています。
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
});
例外の処理方法の扱いは特に優れています。
WinJsの参考資料にもかかわらず、Promise APIは多くの実装で広く類似しているため、これは一般的なビデオシリーズです。
お返事お願いしますは、Promise / A +テストスイートに合格する軽量のPromise実装です。WinJSインターフェースとスタイルが似ているので、私はAPIがとても好きです。
2014年4月の更新
ちなみに、WinJSライブラリは現在オープンソースです。
deferreds
とresolve
してdeferred.promise.then
との事前に定義するpromiseActions
人気のQライブラリのドキュメントに。Node.jsでこれほど簡単なことを知っている可能性はありますか?
promiseのもう1つの利点は、エラー処理と例外のスローとキャッチが、コールバックで処理するよりもはるかに優れていることです。
bluebirdライブラリはpromiseを実装し、非常に長いスタックトレースを提供し、非常に高速で、キャッチされていないエラーについて警告します。また、http://bluebirdjs.com/docs/benchmarks.htmlによると、他のpromiseライブラリよりも高速でメモリ使用量も少ないとのことです。
正確には何が約束ですか?
promiseは、非同期操作の結果を表すオブジェクトです。promiseは次の3つの状態のいずれかになります。
pending ::これは初期状態です。つまり、約束は履行されず、拒否もされません。
満たされた ::これは、約束が満たされたことを意味します。つまり、約束によって表される値を使用する準備ができていることを意味します。
rejected ::これは、操作が失敗したため、約束を履行できないことを意味します。州とは別に、私たちが本当に理解する必要がある約束に関連する3つの重要なエンティティがあります。
executor関数:: executor関数は、実行する必要があり、その結果がpromiseによって表される非同期操作を定義します。promiseオブジェクトが初期化されるとすぐに実行を開始します。
resolve :: resolveは、executor関数に渡されるパラメーターです。executorが正常に実行された場合、このresolveは、結果の受け渡しと呼ばれます。
reject :: rejectは、executor関数に渡される別のパラメーターであり、executor関数が失敗したときに使用されます。失敗の理由を拒否に渡すことができます。
したがって、promiseオブジェクトを作成するときは常に、Executor、Resolve、およびRejectを提供する必要があります。
リファレンス:: 約束
最近、node.jsでのプロミスについても調べています。これまでのところ、when.jsはその速度とリソースの使用のために進むべき道のようですが、q.jsのドキュメントは私に多くの理解を与えてくれました。したがって、主題を理解するには、when.jsを使用しますが、q.jsのドキュメントを使用します。
github のq.js readme から:
関数がブロックせずに値を返すことも例外をスローすることもできない場合は、代わりにpromiseを返すことができます。promiseは、関数が最終的に提供する可能性がある戻り値またはスローされた例外を表すオブジェクトです。promiseは、レイテンシを克服するためのリモートオブジェクトのプロキシとしても使用できます。
Promiseオブジェクトは、非同期操作の完了または失敗を表します。
したがって、promiseを実装するには、2つの部分が必要です。
1. 約束の作成:
promiseコンストラクターは、解決と拒否の2つのパラメーターを持つ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 })