NodeJS_javascriptスキルにおけるPromiseの使用状況分析

WBOY
リリース: 2016-05-16 15:02:00
オリジナル
1443 人が閲覧しました

JavaScript の特性は非同期です。JavaScript は待機する必要があるものを実装する場合、そこで停止して結果が返されるのを待つことはできません。それどころか、コールバックを使用する必要があります。関数を定義すると、この関数は結果が利用可能になるまで待機することしかできません。結果が利用可能になったときにのみ呼び出すことができます。

このコールバック モデルは、適切なコード構成には問題ありませんが、元のコールバックから Promise に切り替えることで、多くの問題を解決できます。これにより、コード構成が簡素化されます。建築。

約束とは何ですか?

Promise は、「.then()」メソッドを備えたオブジェクトです。これは、誰がこのオブジェクトにアクセスしても、操作の結果がまだ取得できないか、または不明である可能性があることを表します。 " メソッド。操作が成功または失敗したときにリマインダー通知を待機するコールバックを追加します。

それでは、なぜこれがコールバックよりも優れているのでしょうか?標準のコールバック モードでは、リクエストを処理するときにコールバック関数が必要です:

request(url, function(error, response) { 

 // handle success or error.

});

doSomethingElse(); 

ログイン後にコピー

残念ながら、このコードはリクエスト関数がいつ完了するか分からないことを意味しており、もちろんその必要はなく、最終的にはコールバックを通じて結果を渡すことになります。これにより、複数のコールバックがネストされたコールバック、つまりコールバック トラップを形成します。

queryTheDatabase(query, function(error, result) { 

 request(url, function(error, response) {

  doSomethingElse(response, function(error, result) {

   doAnotherThing(result, function(error, result) {

    request(anotherUrl, function(error, response) {

     ...

    });

   });

  });

 });

});

ログイン後にコピー

Promise はこの問題を解決し、低レベルのコードでリクエストを作成し、未完了の操作を表すオブジェクトを返し、呼び出し元がどのコールバックを追加するかを決定できるようにします。

約束とは何ですか?

Promise は、値を返すか例外をスローするプロキシ オブジェクトです。一般に、Promise オブジェクトには then メソッドがあり、この then メソッドが戻り値 (結果の値) を取得します。 Promise の実装が成功した場合 (フルフィルメントと呼ばれます)、または例外 (Promise を拒否する理由、拒否と呼ばれます) をスローした場合は、onFulfilled と OnRejected を呼び出すことができる 2 つのオプションのコールバックをパラメータとして使用します。

var Promise = doSomethingAync() promise.then(onFulfilled, onRejected)

この Promise が解決されるとき、つまり非同期プロセスが完了した後、onFulfilled または OnRejected が呼び出されます。

したがって、Promise には次の 3 つの異なる状態があります:

■pending 保留中の Promise - Promise の初期状態 ■履行された約束 - 約束は正常に履行されました
■拒否 - 約束が失敗した状態

ファイルの読み取りを例に挙げると、コールバックを使用してファイルの読み取り (出力印刷) を実装した後、次のことを行う必要があります。

readFile(function (err, data) {

 if (err) return console.error(err)

 console.log(data)

})

ログイン後にコピー
readFile 関数が Promise を返す場合、次のように同じロジック (出力印刷) を実装できます。

var Promise = readFile()

promise.then(console.log, console.error)

ここには、非同期操作を表す値 Promise があり、この値にアクセスする人は、この値によって表される非同期操作が完了したかどうかに関係なく、いつでも then を使用してそれを使用できます。この Promise で表される非同期操作は 1 回だけ実行され、ステータスは満たされるか拒否されるため、非同期の結果が変わらないことも保証できます。

約束を理解する

Promise は日常の直感とは異なる場合があります。それを理解するには、.then() は常に新しい Promise を返します。たとえば、次のコードのように、いくつかの重要な原則を覚えておく必要があります。

var Promise = readFile()

varpromise2 =promise.then(readAnotherFile, console.error)


ここでのパラメータ readAnotherFile と console.error は、非同期操作が成功した後のアクション onFulfilled または失敗後のアクション OnRejected を表します。つまり、ファイルが正常に読み取られた後に readAnotherFile 関数が実行され、それ以外の場合はエラーになります。失敗時に印刷および記録されます。この実装は、可能な 2 つのうちの 1 つにすぎません。

上記のコードを次のように見てみましょう:

var promise = readFile()

var promise2 = promise.then(function (data) {

 return readAnotherFile() // 如果readFile成功,执行readAnotherFile

}, function (err) {

 console.error(err) // 如果readFile不成功,记录,但是还是执行readAnotherFile

 return readAnotherFile()

})

promise2.then(console.log, console.error) // readAnotherFile函数的执行结果

ログイン後にコピー
then は Promise を返すため、Promise はシリアル チェーンによって消費され、コールバック地獄を回避できることを意味します。


Promise法则有两部分必须分离:

(1).then()总是返回一个新的promise,每次你调用它,它不管回调做什么,因为.then()在回调被调用之前已经给了你一个承诺promise,回调的行为只影响承诺promise的实施,如果回调返回一个值,那么promise将使用那个值,如果这个值是一个promise,返回这个promise实施后的值给这个值,如果回调抛出错误,promise将拒绝错误。

(2)被.then()返回的promise是一个新的promise,它不同于那些.then()被调用的promise,promise长长的链条有时会好些隐藏这个事实,不管如何,每次.then()调用都会产生一个新的promise,这里必须注意的是你真正需要考虑的是你最后调用.then()可能代表失败,那么如果你不捕获这种失败,那么容易导致你的错误exception消失。

一些人认为.then()串联链条调用很类似fluent风格,但是长长的promise链条会让人迷惑,最后切分为一个个有意义的函数:

function getTasks() { 

 return $http.get('http://example.com/api/v1/tasks')

  .then(function(response) {

   return response.data;

  });

}

 

function getMyTasks() { 

 return getTasks()

  .then(function(tasks) {

   return filterTasks(tasks, {

    owner: user.username

   });

  });

}

ログイン後にコピー

在这个例子中,两个函数各自获得一个promise,携带了一个回调函数。

有趣的Promise

同样的promise能够接受任何数目的回调,当一个Promise被解决实施后,其中所有回调函数都会被调用,此外,一个promise在被解决实施后,甚至可以接受一个新的回调,这些回调完成能以正常方式被调用,这就允许我们使用回调实现简单形式的缓存:

var tasksPromise; 

function getTasks() { 

 taskPromise = taskPromise || getTasksFromTheServer();

 return taskPromise;

}

ログイン後にコピー

这个案例中,getTasks()函数可以被任意次数调用,它总是返回铜牙的promise,其中函数getTasksFromTheServer()却只是被调用一次。

以上这篇NodeJS的Promise的用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!