148

私が理解したことから、非同期コードを呼び出すには3つの方法があります。

  1. イベント、例えばrequest.on("event", callback);
  2. コールバック、例fs.open(path, flags, mode, callback);
  3. 約束

node-promiseライブラリを見つけましたが、見つかりません。

誰かが約束とは何か、なぜ私がそれを使うべきなのか説明してもらえますか?

また、なぜNode.jsから削除されたのですか?

4

9 に答える 9

98

この質問にはまだ多くの見解があります(私のように)ので、私はそれを指摘したいと思いました:

  1. node-promiseは私にはかなり死んでいるように見え(最後のコミットは約1年前でした)、テストはほとんど含まれていません。
  2. 先物モジュールは私には非常に肥大化しているように見え、文書化も不十分です(そして命名規則はただ悪いと思います)
  3. 最善の方法は、アクティブで十分に文書化されているqフレームワークのようです。
于 2012-05-16T20:41:46.490 に答える
91

node.jsのPromisesは、いくつかの作業を行うことを約束し、その後、成功と失敗、およびタイムアウトの処理のために実行される個別のコールバックを持っていました。node.jsのpromiseを考える別の方法は、成功とエラーの2つのイベントのみを発行できるエミッターであるというものでした。

Promiseの優れた点は、それらを依存関係チェーンに結合できることです(PromiseAとPromiseBが完了した場合にのみPromiseCを実行します

それらをコアnode.jsから削除することで、コアの上に置くことができるPromiseのさまざまな実装でモジュールを構築する可能性が生まれました。これらのいくつかは、ノードの約束先物です。

于 2010-11-28T14:05:45.660 に答える
19

約束とは、いわば手術の「最終的な」結果を表す「もの」です。ここで注意すべき点は、何かが起こったときの詳細を抽象化し、何かが起こった後に何が起こるべきかに焦点を当てることができるということです。これにより、クリーンで保守可能なコードが作成され、コールバック内のコールバック内にコールバックを含める代わりに、コードは次のようになります。

 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/

于 2014-05-23T16:11:15.220 に答える
12

PouchDBの作者によるPromisesに関するこの新しいチュートリアルは、おそらく私がどこでも見た中で最高のものです。それは、正しい使用パターンと、他のチュートリアルでもまだ一般的に使用されているいくつかのアンチパターンを示す古典的な新人の間違いを賢くカバーしています!!

楽しみ!

PS他の人によく取り上げられているので、この質問の他の部分には答えませんでした。

于 2015-05-25T01:39:00.093 に答える
7

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ライブラリは現在オープンソースです。

于 2012-12-13T15:00:11.850 に答える
5

promiseのもう1つの利点は、エラー処理と例外のスローとキャッチが、コールバックで処理しようとするよりもはるかに優れていることです。

bluebirdライブラリは、 promiseを実装し、非常に長いスタックトレースを提供し、非常に高速で、キャッチされていないエラーについて警告します。また、 http://bluebirdjs.com/docs/benchmarks.htmlによると、他のPromiseライブラリよりも高速でメモリの使用量も少なくなっています。

于 2014-03-14T15:30:22.283 に答える
4

Promiseとは正確には何ですか?

promiseは、非同期操作の結果を表す単なるオブジェクトです。約束は、次の3つの状態のいずれかになります。

保留中::これは初期状態であり、約束が履行も拒否もされていないことを意味します。

履行済み::これは、promiseが履行されたことを意味し、promiseで表される値を使用する準備ができていることを意味します。

拒否::これは、操作が失敗したため、約束を果たすことができないことを意味します。州とは別に、私たちが本当に理解する必要がある約束に関連する3つの重要なエンティティがあります

  1. executor関数::executor関数は、実行する必要があり、その結果がpromiseによって表される非同期操作を定義します。promiseオブジェクトが初期化されるとすぐに実行を開始します。

  2. resolve :: resolveは、エグゼキュータ関数に渡されるパラメータです。エグゼキュータが正常に実行された場合、このリゾルブは結果の受け渡しと呼ばれます。

  3. リジェクト::リジェクトはエグゼキュータ関数に渡される別のパラメータであり、エグゼキュータ関数が失敗したときに使用されます。失敗の理由は拒否に渡すことができます。

したがって、promiseオブジェクトを作成するときは常に、Executor、Resolve、およびRejectを提供する必要があります。

参照::約束

于 2017-05-18T20:18:45.560 に答える
0

最近、node.jsのpromiseも調べています。これまでのところ、when.jsはその速度とリソースの使用のために進むべき道のようですが、q.jsのドキュメントは私にはるかに良い理解を与えてくれました。したがって、when.jsを使用しますが、q.jsドキュメントを使用して主題を理解します。

githubのq.jsreadmeから:

関数がブロックせずに値を返したり例外をスローしたりできない場合は、代わりにpromiseを返すことができます。promiseは、関数が最終的に提供する可能性のある戻り値またはスローされた例外を表すオブジェクトです。Promiseは、遅延を克服するためのリモートオブジェクトのプロキシとしても使用できます。

于 2014-06-13T10:09:33.780 に答える
0

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
})
于 2020-05-24T17:07:40.537 に答える