(JQuery) Ajax Use When

前言

在翻找舊程式中發現了一個舊的寫法,是需要拿到兩個 Ajax Respond 再做後續的動作,兩個 Ajax 也沒有先後順序,但是舊的寫法是在兩個 Ajax 下 Flag 然後判斷 Flag 去做後續的事情,

所以遇到了點問題,所以研究了一下 Ajax Promise 的寫法。

內文 

 $.ajax({
         url : sourceFewSourceCodeUrl,
         method : "GET",
         success : function(sourceCodeDetail) {

	   loadSourceSuccess = true;
	   renderStickyWindowAndSyntaxhighlight();
	 },
         error : function() {
            loadSourceSuccess = false;
         }
 });

 $.ajax({
	 url : targetFewSourceCodeUrl,
	 method : "GET",
	 success : function(sourceCodeDetail) {

	   loadTargetSuccess = true;
	   renderStickyWindowAndSyntaxhighlight();
	 },
	 error : function() {
	   loadTargetSuccess = false;
	 }
  });

  function renderStickyWindowAndSyntaxhighlight() {
	  var loadSuccess = (loadSourceSuccess && loadTargetSuccess);
          var loadFailure = (loadSourceSuccess == false || loadTargetSuccess == false)
	            
	  if (loadSuccess) {
          //TODO SOME
        }
  }

上面是原先的寫法,等於會跑兩次  renderStickyWindowAndSyntaxhighlight() ,因為是非同步所以 Ajax哪個先回來也不一定,所以改成 $.when 的寫法讓他同步

var sourcePromise = $.ajax(sourceFewSourceCodeUrl);
var targetPromise = $.ajax(targetFewSourceCodeUrl);
	        
//用 When 來同時拿到 Ajax Respond
$.when(sourcePromise, targetPromise).done(function(sourceInformation, targetInformation) {
	        	
    renderStickyWindowAndSyntaxhighlight();
                
}).fail(function(sourceInformation, targetInformation) {
    //只要有一個 Fail 就直接報錯
    MessageBox.error(LOAD_SOURCE_FAILURE);
    MessageBox.error(LOAD_TARGET_FAILURE);
});

上面的寫法就可以同時拿到 Respond 再去做 renderStickyWindowAndSyntaxhighlight() ,就不用跑兩次囉 !

然後 Fail 的部分只要一個 Fail 就會進去了,後續拿到的結果都會變成 false ,會有以下的問題,例如:

 A 的 callback :true

的 callback :false

 C 的 callback :true

使用$.when()方法會得到

  • [when] (fail callback): a: true, b: false, c: false

下面提供別人的解法

https://stackoverflow.com/questions/5518181/jquery-deferreds-when-and-the-fail-callback-arguments

$.when 的寫法在底層其實是用jQuery.Deferred() 在做手腳。

 參考資料

http://eddychang.me/blog/javascript/56-jquery-promise.html

https://api.jquery.com/jquery.when/