抜粋 – Parse JavaScript SDK は、ほとんどの非同期メソッドをサポートする jquery 互換の Promises モードを提供するようになりました。これが何を意味するかは、以下を読むと理解できるでしょう。
「Promise」は JavaScript プログラミングにおける次の素晴らしいパラダイムを表していますが、なぜそれがそれほど素晴らしいのかを理解するのは簡単ではありません。その核心は、Promise がタスクの結果を表し、完了する場合と完了しない場合があるということです。 Promise モードで必要な唯一のインターフェイスは then メソッドを呼び出すことです。これは、Promise が完了または失敗したときに呼び出されるコールバック関数を登録するために使用できます。これについては、一般的に CommonJS Promises/A proposal。たとえば、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. });
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. } }); } }); } });
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. } });
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. });
jQuery、バックボーン、解析
開発者が使用できる Promise を実装するライブラリは数多くあります。 jQuery の Deferred、Microsoft の WinJS.Promise、when.js、q、dojo.Deferred と同様です。
しかし、知っておくべき興味深いことがあります。 ここで、長くて魅力的な jQuery のプル リクエストのディスカッションを読むことができます。jQuery の実装は、Promises/A のルールに完全には準拠していません。実験中に、1 つだけ違いがあることがわかりました。エラー ハンドラーが単に Promise を返す以外の情報を返す場合、ほとんどの実装はエラーを伝播せずにエラーを処理することを検討します。ただし、jquery はこのエラーをここで処理しようとは考えず、代わりに前方に渡します。異なるシステムの Promise はシームレスに混在する必要がありますが、注意が必要です。潜在的な問題の 1 つは、Promise が同等に扱われるため、エラー ハンドラー内で Promise が返される (元の値を置き換える) ことです。
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.". });
Cloud Code
ではうまく動作しないため、jqXHR を返すことはできません。 Parse.Promise クラスを追加します。これは、jQuery Deferred 標準に従います。 Parse JavaScript SDK最新バージョンでは、これらの新しいオブジェクトをサポートするためにすべての非同期メソッドが更新されており、古いコールバック メソッドも引き続き使用できます。しかし、上記の例に基づくと、あなたは新しい方法を好むと思います。だから約束をしてみてください!