2016-08-17 9 views
2

私のアプリケーションにはAJAX呼び出しが多数あり、それぞれJSON応答を返します。各.done()呼び出しでデータを検証する代わりに、コードをコンパクトにしようとしています。JQuery AJAX - .done()前のフィルタ

我々がこれまで持って何

$.ajax({ 
    url: 'test', 
    type: 'GET', 
    data: { 
     _token: token 
    }, 
    dataFilter: function(jsonResponse) { 
     return isValidJson(jsonResponse); 
    } 
}).done(function(jsonResponse) { 
    // do things 
}); 

isValidJson(jsonResponse) { 
    try { 
     var parsedJson = $.parseJSON(jsonResponse); 

     if (parsedJson.error == 1) { 
      notificationController.handleNotification(parsedJson.message, 'error'); 

      return false; 
     } 
    } catch (err) { 
     notificationController.handleNotification('A server-side error occured. Try refreshing if the problem persists.', 'error'); 

     return false; 
    } 

    return jsonResponse; // Have to return the original data not true 
} 

予想される動作はdataFilterがfalseを返した場合、それは)それがtrueを返した場合、それは(の.doneしていきます、)(.failをトリガすることです。代わりに、isValidJson()の結果で.done()を継続します。

すべてのAJAX呼び出しの下に置かなくても、ユーザに通知を送信するような、.fail()の標準を実行する方法もありますか?

+1

号「_A機能これは、プレフィルタリングです。応答をサニタイズする機能**あなたは浄化されたデータを返すべきです**。したがって、jsonのチェックがOKであれば、FALSEをTRUEに戻すべきではありません。あなたのストラテジーは間違っています –

+0

@RoyiNamirありがとうございます。 .done()以外のデータをすべてのAJAX呼び出しでフィルタリングする正しい方法を知っていますか?私は何かを拡張するべきですか? –

+1

これは試しましたか?var jxhr = $ .ajax(dataFilter:function(){jxhr.abort()}); ? – Kison

答えて

2

最も簡単な方法は、それを拡張することにより、$アヤックスのための速記を作成することです。

jQuery.extend({ 
    myAjax: function(params){ 
     // Here we can modify the parameters and override them e.g. making 'error:' do something different 
     // If we want to add a default 'error:' callback 
     params.error = function() { 
      console.log('its failed'); 
     }; 

     // or you can specify data parse here 
     if (params.success && typeof params.success == 'function') { 
      var successCallback = params.success; 
      var ourCallback = function(responseJson) { 
       if (isValidJson(responseJson)) { // Validate the data 
        console.log('The json is valid'); 
        successCallback(responseJson); // Continue to function 
       } else { 
        console.log('The json is not valid'); 
       } 
      } 

      params.success = ourCallback; 
     } 

     return $.ajax(params); 
    } 
}); 

AJAX呼び出しを拡張

は今、毎回、あなたは$アヤックスを({})を使用しないでください、あなたのアプリケーションにAJAX呼び出しを作りたいです。代わりに、$ .myAjax({})を使用します。

$.myAjax({ 
    url: 'domain.com', 
    type: 'GET', 
    success: function(data) { 
     // Do what you'd do normally, the data here is definitely JSON. 
    }, 
    error: function(data) {} 
}); 

そして、この特別な機能は、同じように、それらのバリデータを毎回書く必要がすべてのエラーを処理しません。

+1

よく、そこには2つのコールバックがあります。 $ .ajaxの 'error'とxhrオブジェクトの' fail'です。私は$ .ajaxの失敗を設定しようとしていました。あなたのフィドルを編集しました。https://jsfiddle.net/drnuz676/6/ –

1

この(Not tested)のようにそれをやろう:

var jxhr = $.ajax({ 
    url: 'test', 
    type: 'GET', 
    data: { 
     _token: token 
    }, 
    dataFilter: function(jsonResponse) {   
     if (!isValidJson(jsonResponse)) { 
      jxhr.abort(); 
     } 
     return jsonResponse; 
    } 
}).done(function(jsonResponse) { 
    // do things 
}); 
+0

「懸念の分離」原則に違反しています。なぜAの行動はBの行動のために偽に戻るべきですか? Aのアクションはtrueを返し、必要ならばBのアクションに対してfalseを返します。 –

+0

@Kison .abort()は依然として.done()を呼び出します。これがうまくいけば、将来のすべてのAjaxリクエストに自動的に適用する方法がありますか? –

+0

@RoyiNamirあなたは正しいです、より正しい方法でこれを行う方法を考える必要があります – Kison

1

この戦略を使用することで、あなたは "分離の懸念"戦略に違反しています。

Ajaxは、そのアクションに従って解決または拒否する必要があります。レスポンスがJSONであるかどうかによらず

可能溶液:のXMLHttpRequestの生応答データを処理するために使用される(他のソリューションも存在確認)

function GetSanitized(d) { 
    return d.then(function(a) { 
      if (a.indexOf('{') > -1) //check if json (just for example) 
       return $.Deferred().resolve(JSON.parse(a)); //return object 
      else 
       return $.Deferred().reject(a); //reject 
     }, 

     function() { 
      return $.Deferred().reject("ajax error"); //ajax failed 
     } 

    ); 
} 

var ajax = $.Deferred(); 

GetSanitized(ajax) .then(function (a){alert(" Json p's value is "+a["p"]);},function (a){alert("Error"+a);}); 


ajax.resolve("{\"p\":2}"); //simulate ajax ok , valid json 
//ajax.resolve("\"p\":2}"); //simulate ajax ok , invalid json 
//ajax.reject("\"p\":2}"); //simulate ajax bad , valid json 

http://jsbin.com/vozoqonuda/2/edit

関連する問題