2013-01-18 7 views
17

は、私が何を私はそれ欲しいんコードのこのスニペットを見つけました。このコードは文書番号hereです。しかし、私はconsole.log()呼び出しで生のテキスト文字列を取得しても、何も記録していません。jQueryの約束とバックボーン

誰かがjQueryの約束どおりに説明してください。私はそれらについて読んだことがありますが、私は彼らが本当に何かを持っているとは思いません。それは私がこのコードが私のために働いていない理由を理解する助けになるかもしれません。コードの第1行目と第2行目の間にI console.log(promise)があると、responseTextになります。このため、$.whenまたはthenのいずれかで問題が発生しています。

EDIT:

記事を読んだ後、私は私がこれを行う可能性が発見された:

var promise = this.model.save(); 
$.when(promise).then(null, function(obj) { 
    console.log(obj.responseText); 
}); 

をしかし、私はnullが何を表すかを理解していません。 thenは成功関数と失敗関数の2つのパラメータを取っているようです。しかし、成功の機能は最初ではないでしょうか?私はサーバーから200応答を取得します。

+0

これを読むhttp://css.dzone.com/articles/exploring-deferred-and-promise –

+0

これは良い記事のようです。ありがとう。 – sehummel

+0

probs :)幸せな読書.. –

答えて

26

最初に、私はあなたがwhen部分を必要としないと確信しています。 jQueryのドキュメントから:

The jqXHR objects returned by $.ajax() as of jQuery 1.5 implement the Promise interface, giving them all the properties, methods, and behavior of a Promise (see Deferred object for more information).

の約束がすでにthenメソッドを持っているので、あなただけ行うことができます。

this.model.save().then(null, function(obj) { 
    console.log(obj.responseText); 
}); 

(上記のコードはほとんど英語の文のように読めるということが主な利点でありますあなたのnull引数に関しては、ドキュメントはかなりきれいです。そこ3人の署名がthenのためのもの(それは別のjQueryのバージョンをカバーするだけです。任意のバージョンでは、以下があります):

deferred.then(doneFilter [, failFilter ] [, progressFilter ])

deferred.then(doneCallbacks, failCallbacks)

deferred.then(doneCallbacks, failCallbacks [, progressCallbacks ])

あなたが見ることができるように、すべての3つは、最初の「完了」機能を取り、障害機能秒。これはあなたが失敗していることを暗示しているようですが、それは混乱しています。この問題を回避する方法の1つは、thenをまったく使用しないことです。代わりに、以下を試してください。

this.model.save().always(function(obj) { 
    console.log(obj.responseText); 
}); 

これは、何が起こっても機能が呼び出されるようにします。あなたの代わりに、いくつかのデバッグを行うために、成功と失敗のコールバックを追加したい場合がありますので、しかし、あなたはおそらく、何が起こっているかを把握する必要があります

this.model.save().done(function() { 
    // Success case 
}).fail(function() { 
    // Failure case 
}); 
+0

これらのような単純なバックボーンコールバックの代わりにjqueryの遅延を使用する利点は何ですか? 'this.model.save({成功:関数(){ }、エラー:関数(){ }});' – Ingro

+2

それは本当にただのスタイルです。あなたが複雑なことをしている場合(2つのAJAX呼び出しを作成する場合、最初の呼び出しから戻って来るデータが必要な場合)、Deferredスタイルを使用すると非常に優雅に行うことができます。そうでなければ、あなたのコードのスタイルをどのようにしたいかという問題です。実際、これはバックボーン固有の問題ではありません。単に普通の古いjQueryで '$ .ajax({success:handler});' vs、 '$ .ajax({})。done(handler)'を選択することもできます。 – machineghost

+0

@ machineghost。ご清聴ありがとうございます。これはたくさん説明します。 – sehummel

7

this.model.saveは約束を返すので、あなたの代わりに次の操作を行うことができます。

this.model.save() 
    .done(function(response) { 
     console.log("Success!"); 
    }) 
    .fail(function(response) { 
     console.log("Error!"); 
    }); 

を(それは全体$.whenビットよりも簡単です。)

私の推測では、あなたの応答が200コードを返しているものの、ということです応答データ型が期待しているもの($.ajax呼び出しのdataType属性に設定されているもの)と一致しないため、依然として「失敗」しています。

0

私は約束を使用しての大ファンです、と私は約束の手段を考えますさまざまなパッケージで非常に似たようなものです。

これまでの回答ではなかった質問に答えるために、 "then"関数は約束の関数であり、 "when"関数はフェイルセーブであり、オブジェクトは約束ではなく、 "when (obj) "はそれが約束であることを確認するので、上品なxxx.then(success(){}、error(){})を使用することができます。

btw、「遅延」とは、あなたが約束をするパッケージです。 約束を知り始め、それを使用する方法について。このチュートリアルをチェックしてください。それはすべてのことを非常にはっきりと説明しています。今 http://strongloop.com/strongblog/promises-in-node-js-with-q-an-alternative-to-callbacks/

、machineghostが言ったように、それはあなたの同期呼び出しがエラーになっているようだ、REST APIドキュメント、https://parse.com/docs/rest#(それはバックボーンと同じであるかどうかを知りません)によると、サーバはJSONレスポンスますこの形式では、「作成」要求のためのオブジェクト:

{"createdAt": "2011-08-20T02:06:57.931Z","objectId": "Ed1nuqPvcm"} 

私の推測では、多分あなたのサーバーが正しいJSONで要求を応答しませんでしたので、保存()は「createAtがなかったため、操作が失敗したと思います、です"フィールド、イベントは、あなたのサーバーがアイテムを作成したと思った。