2

私はあなたがこのようなものを持っていると言うのだろうか

// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.ajax({ url: "example.php" })
    .success(function(response) { alert("success"); })


// perform other work here ...

// Set another success function for the request above
jqxhr.success(function(response){ alert("second success"); });

だから私はこう考えています。成功に渡されるすべての応答で使用したい一般的な関数があります。

この関数は基本的に、サーバーの検証でエラーが見つかったかどうかを確認するためのチェックを行います。実行された場合は、フォーマットしてメッセージを表示します。

今、特定のことを行うために2番目の成功関数をどのように持つことができるかどうか疑問に思っています。たとえば、1 つの ajax リクエストでテーブルに行を追加する必要があります。したがって、これは可能なはずです。上記のことを行うだけで、2回目の成功では行を追加するだけです。

最初の成功が実行され、サーバーからの検証エラーがあることがわかった場合、2 番目の成功が起こらないようにすることは可能ですか?

並べ替え

If(first success finds errors)
{
   // print out errors
   // don't continue onto next success
}
else
{
   // go to next success 
}

編集

deferred.rejectと呼ばれるものがあることがわかりましたが、これはそれを停止しますが、成功したものだけを停止するように指定するにはどうすればよいでしょうか。私の考えでは、完了のような他の延期されたものがある場合、それも拒否されますか?

4

3 に答える 3

0

最初の成功関数がAJAX呼び出しからの応答を評価し、それが要件を満たしていると判断したときに、2番目の成功関数を呼び出します

例:

$.post('example.php', {name_1: value_1, name_2: value_2}, function(response){
  //this code gets executed when the AJAX request was successful

  //do some more stuff

  //check the response
  if(response == 'success'){
    second_success_function(response);
  }
});

この例では、すべてが計画どおりに進んだときに文字列「success」を取得することを前提としています。

$ .post呼び出しの2番目の引数は、スクリプトに渡す値のマップです。これはオプションです。

すべてのAJAXリクエストが完了したときに実行されるハンドラーを割り当てることもできます。

http://api.jquery.com/ajaxStop/

于 2011-03-02T23:13:44.277 に答える
0

AFAIK いいえ、そのような遅延オブジェクトを使用することはできません ( jQuery v1.5.ajax()オブジェクトは遅延オブジェクトを拡張します)。

遅延オブジェクトにコールバックを追加している場合、つまり.success(.....スタックされています。遅延オブジェクトが解決されるとすぐに( ajax が正常に終了すると)、スタックされたすべてのコールバックが実行されます。たとえば、実行中の成功コールバックを停止するなど、オブジェクトを試行して拒否するには遅すぎます。ここで例を見てみましょう

成功関数で必要なロジックを実行し、繰り返しのアクションを処理するラッパー関数を呼び出して、ロジック テストが成功した場合に成功から呼び出す方がよいでしょう。


コメントに従って更新します。

var cs = true;
var jqxhr = $.ajax({ 
    beforeSend: function(){
        cs=true;
    },
    url: "/echo/json/" 
})

.success(function(response) { 
    if(cs)
    alert("success"); 
})

.success(function(response) { 
    if(cs)
        cs = false;
        alert("success 2"); 
})

.success(function(response) { 
    if(cs)
        alert("success 3"); 
});

ロジックを使用してコールバックを強制終了します。

于 2011-03-02T23:25:16.467 に答える
0

検証チェック関数が 1 つしかない場合は、ajax リクエストに直接ではなく、独自の遅延を作成してハンドラーをそれにアタッチできます。

この例では、単一レベルの検証を提供します。それらを連鎖させたい場合は、別のパターンが必要になる場合があります。

var validated = function(jqxhr, validationFunction){
    var myDeferred = new $.Deferred();
    var doValidation = function(){
        var result = validationFunction.apply(this, arguments);
        if (result){
            myDeferred.resolve(arguments);
        }
        else
        {
            myDeferred.reject(arguments);
        }
    };

    jqxhr.success(doValidation);
    return myDeferred;
};

var jqxhr = $.ajax({ url: "/echo/json/"});
var vtest = validated(jqxhr, function(response){
    //Do your validation check here,
    //return true if it passed, false if it failed.
    return false; 
});

//attach your handlers to vtest
vtest.done(function(response){alert("yay");});
vtest.fail(function(response){alert("drats");});
于 2011-03-03T00:19:55.413 に答える