18

私がやりたいことを実行するこのコードスニペットを見つけました:

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

responseTextバックボーン コールからへの を戻したいですthis.model.save()。このコードはここに文書化されています。console.log()しかし、呼び出しで生のテキスト文字列を取得しても、何もログに記録されません。

誰かがjQueryの約束とは何かを素人の言葉で説明してもらえますか? 私はそれらについて読んだことがありますが、私はそれらが何であるかを完全に理解しているとは思いません. これは、このコードが機能しない理由を理解するのに役立つかもしれません。console.log(promise)コードの 1 行目と 2 行目の間にある場合は、 responseText. $.whenそのため、または のいずれかで何かがthen発生しており、これが問題を引き起こしています。

編集:

この記事を読んだ後、私はこれができることを発見しました:

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

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

4

3 に答える 3

28

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

jQuery 1.5 の時点で $.ajax() によって返される jqXHR オブジェクトは、Promise インターフェイスを実装し、Promise のすべてのプロパティ、メソッド、および動作を提供します (詳細については、Deferred オブジェクトを参照してください)。

Promise にはthen既にメソッドがあるため、次のように実行できます。

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

(少なくとも私にとっては、上記のコードがほとんど英文のように読めるという事実が、Deferred を使用する大きな利点です。)

あなたのnull議論に関しては、ドキュメントは再びかなり明確です。には 3 つの署名がありますthen(これは、さまざまな jQuery バージョンをカバーするためのものです。特定のバージョンでは少ないです)。

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

deferred.then( doneCallbacks, failCallbacks )

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

ご覧のとおり、3 つすべてが最初に "done" 関数を使用し、2 番目に失敗関数を使用します。これは、混乱を招く失敗が発生していることを意味しているようです。この問題を回避する 1 つの方法は、まったく使用thenしないことです。代わりに、次のことを試してください。

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

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

this.model.save().done(function() {
    // Success case
}).fail(function() {
    // Failure case
});
于 2013-01-18T23:39:14.527 に答える
7

promise を返すためthis.model.save、代わりに次のことができます。

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

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

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

于 2013-01-18T23:38:24.407 に答える
0

私は promise の使用の大ファンであり、promise はさまざまなパッケージで非常によく似たものを意味すると思います。

以前の回答では答えられなかったあなたの質問に答えるために、「then」関数はプロミスの関数であり、「when」関数はフェイルセーブです。オブジェクトがプロミスでない場合、「when(obj)」エレガントな xxx.then(success(){},error(){}) を使用できるように、それが promise であることを確認します。

ところで、machineghost が言った「遅延」は、promise を使用できるようにするパッケージです。Promise とその使用方法を知り始めるため。このチュートリアルをチェックしてください。それはすべてを非常に明確に説明しています。私を約束に駆り立てたのは記事です。 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 でリクエストに応答しなかったため、save() は「createAt」フィールドがなかったため操作が失敗したと考え、サーバーがアイテムを作成したと考えたイベントです。

于 2014-08-01T19:14:06.153 に答える