JavaScriptでのPromiseの使用例の詳細
4537 ワード
抜粋、C Parse JavaScript SDKは現在、多くの非同期メソッドをサポートするjquery対応のPromisesモードを提供しています.これは何を意味しているのか、後で理解します.
「Promises」はjavascriptプログラムの次の偉大なパターンを表していますが、彼らがなぜこんなに偉大なのかを理解するのは簡単なことではありません.その核心はpromiseがタスクの結果を表し、このタスクが完了していない可能性があります.Promiseモードで唯一必要なインタフェースはthenメソッドを呼び出すことであり、CommonJS Promises/A proposalでpromiseが完了または失敗したときに呼び出されたコールバック関数を登録することができる.だいたい話した.例えば、Praseを保存したいです.Objectオブジェクト、これは非同期操作で、古いコールバックパターンでは、コードがこのように書かれる可能性があります.
大きな違いはありませんか.では、大したところはありませんか.promisesの本当の強さは、promiseを呼び出すと多重リンクにあります.then(func)では、前の完了まで実行されない新しいpromiseが返されます.しかし、ここでは、私のコールバックがthenを通じて新しいpromiseを返すと、thenを通じて返されるpromiseはコールバックが完了するまで実行されません.詳細はPromises/A+を参照してください.これは複雑なルールで、例を通じて私たちはもっとはっきり認識することができます.
ログインしたコードを書いて、オブジェクトを検索して更新したとします.古いコールバックパターンでは、ピラミッド式のコードを使用して完了できます.
これはもうおかしいように見えますが、もっとおかしいのは間違いの処理さえありません.しかしpromiseチェーン式の構造は、コードをより快適に見せることができます.
わあ!だいぶよくなった!
エラー処理
上記のコードは単純な期間にエラー処理が追加されていませんが、追加すると古いコールバックコードの中でめちゃくちゃになります.
promisesは処理が完了したかどうかを知っているため、エラーが発生するまでコールバックを実行せずにエラーを渡すことができます.たとえば、上のコードは以下のように簡単に書くことができます.
通常、開発者は、非同期のpromise失敗が異常を投げ出すことに等しいと考えている.実際、コールバックがエラーを投げ出すとpromiseは失敗情報を返します.エラーを次の使用可能なエラープロセッサに渡すのは、キャプチャ処理まで例外を放出することに等しい.
jQuery,Backbone,Parse
開発者が利用できるpromisesを実現したライブラリはたくさんあります.jQueryのDeferred、マイクロソフトのWinJSのようです.Promise, when.js,q,dojo.Deferred.
しかし、興味深いところがあります.ここでlong and fascinating jQuery pull request discussionを読むことができます.jQueryの実現はPromises/Aのルールに完全に従っていません.多くの場所で他の実現方法を使っています.実験の時、私は1つの場所だけが違います.エラープロセッサがpromiseを単純に返さずに他の情報を返す場合、多くの実装では、エラーの伝達を行わずにこのエラーを処理することを考慮します.しかしながら、jqueryは、ここでこのエラーを処理するのではなく、それを前に伝達する.異なるシステムからのpromiseはシームレスに混合して使用できるはずですが、注意してください.潜在的な問題は、エラープロセッサでpromises(元の数値を置換)が返されることです.なぜなら、それらは同等に扱われるからです.
Backbone 0.9.10の最新バージョンでは、非同期メソッドはjquery promiseのタイプであるjqXHRを返します.Parse JavaScript SDKの1つの目標は、できるだけBackboneと互換性を持つことであり、Cloud Codeでうまく機能しないため、jqXHRを返すことはできません.Promiseクラスで、jQuery Deferredの基準に従います.Parse JavaScript SDKの最新バージョンでは、これらの新しいオブジェクトをサポートするためにすべての非同期メソッドが更新されており、古いコールバックメソッドは依然として使用できます.しかし、上記の例に基づいて、私はあなたが新しい方法が好きだと信じています.だからpromisesを試してみましょう!
「Promises」はjavascriptプログラムの次の偉大なパターンを表していますが、彼らがなぜこんなに偉大なのかを理解するのは簡単なことではありません.その核心はpromiseがタスクの結果を表し、このタスクが完了していない可能性があります.Promiseモードで唯一必要なインタフェースはthenメソッドを呼び出すことであり、CommonJS Promises/A proposalでpromiseが完了または失敗したときに呼び出されたコールバック関数を登録することができる.だいたい話した.例えば、Praseを保存したいです.Objectオブジェクト、これは非同期操作で、古いコールバックパターンでは、コードがこのように書かれる可能性があります.
object.save({ key: value }, {
success:function(object) {
// the object was saved.
},
error:function(object, error) {
// saving the object failed.
}
});
Promise , :
object.save({ key: value }).then(
function(object) {
// the object was saved.
},
function(error) {
// saving the object failed.
});
大きな違いはありませんか.では、大したところはありませんか.promisesの本当の強さは、promiseを呼び出すと多重リンクにあります.then(func)では、前の完了まで実行されない新しいpromiseが返されます.しかし、ここでは、私のコールバックがthenを通じて新しいpromiseを返すと、thenを通じて返されるpromiseはコールバックが完了するまで実行されません.詳細はPromises/A+を参照してください.これは複雑なルールで、例を通じて私たちはもっとはっきり認識することができます.
ログインしたコードを書いて、オブジェクトを検索して更新したとします.古いコールバックパターンでは、ピラミッド式のコードを使用して完了できます.
Parse.User.logIn("user","pass", {
success:function(user) {
query.find({
success:function(results) {
results[0].save({ key: value }, {
success:function(result) {
// the object was saved.
}
});
}
});
}
});
これはもうおかしいように見えますが、もっとおかしいのは間違いの処理さえありません.しかしpromiseチェーン式の構造は、コードをより快適に見せることができます.
Parse.User.logIn("user","pass").then(function(user) {
returnquery.find();
}).then(function(results) {
returnresults[0].save({ key: value });
}).then(function(result) {
// the object was saved.
});
わあ!だいぶよくなった!
エラー処理
上記のコードは単純な期間にエラー処理が追加されていませんが、追加すると古いコールバックコードの中でめちゃくちゃになります.
Parse.User.logIn("user","pass", {
success:function(user) {
query.find({
success:function(results) {
results[0].save({ key: value }, {
success:function(result) {
// the object was saved.
},
error:function(result, error) {
// An error occurred.
}
});
},
error:function(error) {
// An error occurred.
}
});
},
error:function(user, error) {
// An error occurred.
}
});
promisesは処理が完了したかどうかを知っているため、エラーが発生するまでコールバックを実行せずにエラーを渡すことができます.たとえば、上のコードは以下のように簡単に書くことができます.
Parse.User.logIn("user","pass").then(function(user) {
returnquery.find();
}).then(function(results) {
returnresults[0].save({ key: value });
}).then(function(result) {
// the object was saved.
},function(error) {
// there was some error.
});
通常、開発者は、非同期のpromise失敗が異常を投げ出すことに等しいと考えている.実際、コールバックがエラーを投げ出すとpromiseは失敗情報を返します.エラーを次の使用可能なエラープロセッサに渡すのは、キャプチャ処理まで例外を放出することに等しい.
jQuery,Backbone,Parse
開発者が利用できるpromisesを実現したライブラリはたくさんあります.jQueryのDeferred、マイクロソフトのWinJSのようです.Promise, when.js,q,dojo.Deferred.
しかし、興味深いところがあります.ここでlong and fascinating jQuery pull request discussionを読むことができます.jQueryの実現はPromises/Aのルールに完全に従っていません.多くの場所で他の実現方法を使っています.実験の時、私は1つの場所だけが違います.エラープロセッサがpromiseを単純に返さずに他の情報を返す場合、多くの実装では、エラーの伝達を行わずにこのエラーを処理することを考慮します.しかしながら、jqueryは、ここでこのエラーを処理するのではなく、それを前に伝達する.異なるシステムからのpromiseはシームレスに混合して使用できるはずですが、注意してください.潜在的な問題は、エラープロセッサでpromises(元の数値を置換)が返されることです.なぜなら、それらは同等に扱われるからです.
doFailingAsync().then(function() {
// doFailingAsync doesn't succeed.
},function(error) {
// Try to handle the error.
return"It's all good.";
}).then(function(result) {
// Non-jQuery implementations will reach this with result === "It's all good.".
},function(error) {
// jQuery will reach this with error === "It's all good.".
});
Backbone 0.9.10の最新バージョンでは、非同期メソッドはjquery promiseのタイプであるjqXHRを返します.Parse JavaScript SDKの1つの目標は、できるだけBackboneと互換性を持つことであり、Cloud Codeでうまく機能しないため、jqXHRを返すことはできません.Promiseクラスで、jQuery Deferredの基準に従います.Parse JavaScript SDKの最新バージョンでは、これらの新しいオブジェクトをサポートするためにすべての非同期メソッドが更新されており、古いコールバックメソッドは依然として使用できます.しかし、上記の例に基づいて、私はあなたが新しい方法が好きだと信じています.だからpromisesを試してみましょう!