2015-04-17 99 views
4

我有一種情況需要做5個Ajax調用。第二次ajax呼叫將在第一次呼叫返回響應後進行,第三次呼叫在第二次呼叫完成時進行,同樣也是第四次和第五次呼叫。在jQuery中依賴ajax調用的最佳方法

有兩種方法可以解決這個問題,我知道,我可以在先前的調用成功之前嵌套ajax調用,或者在第一次調用之前使異步成爲false,並在上次調用後使其成爲true。任何人都可以建議是哪一個,爲什麼這是更好的方式來完成我的任務,或者有更好的方法來做到這一點。

//First Way 
$.ajax({ 
... 
success:function(){ 
    $.ajax({ 
    ... 
     success:function(){ 
      $.ajax({ 
      ... 
       success:function(){ 
        $.ajax({ 
        ... 
         success:function(){ 
           do something  
         } 
        }); 
       } 
      }); 
     } 
    }); 
} 
}); 

//second way 
$.ajaxSetup({ 
    async: false 
}); 
$.ajax({ 
}); 
$.ajax({ 
}); 
$.ajax({ 
}); 
$.ajax({ 
}); 
$.ajax({ 
}); 
$.ajaxSetup({ 
    async: true 
}); 
+0

什麼是每次請求後執行的邏輯?每個類似的邏輯都是相似的,還是隻需要確保呼叫按照這個順序發生?還要注意'async:false'非常糟糕。幾乎'eval'水平不好;) –

+0

讓我們知道導致你這樣做的原因和情況。 – Puneet

+0

@RoryMcCrossan我的要求是,這個調用是一個接一個地按順序發生的 – Abhishek

回答

5

可以在任何一個建議是,爲什麼它是更好的方式來完成我的任務......

使用async: false將使呼叫同步,它鎖定了UI呼叫正在運行時的瀏覽器。在通話過程中讓用戶界面響應更好。

所以留下異步呼叫是最好的;有幾個方法可以做到這一點:

使用success處理程序,爲你展示有:

$.ajax({ 
    /*...*/, 
    success: function() { 
     $.ajax({ 
      /*...*/, 
      success: function() { 
       $.ajax({ 
        /*...*/, 
        success: function() { 
         $.ajax({ 
          /*...*/, 
          success: function() { 
           $.ajax({ 
            /*...*/ 
           }); 
          } 
         }); 
        } 
       }); 
      } 
     }); 
    } 
}); 

(我假設你已經是註冊一個全球性的Ajax錯誤處理程序,或者你有一個在上面/*...*/

有使用一個承諾,而不是鏈條,這是相當類似:

$.ajax({/*...*/}) 
    .done(function() { 
     $.ajax({/*...*/}) 
      .done(function() { 
       $.ajax({/*...*/}) 
        .done(function() { 
         $.ajax({/*...*/}) 
          .done(function() { 
           $.ajax({/*...*/}); 
          }); 
        }); 
      }); 
    }); 

或者你也可以使用函數廁所p,如下所示:

(function() { 
    var calls = [ 
     function() { $.ajax({/*...*/, success: next)}, 
     function() { $.ajax({/*...*/, success: next)}, 
     function() { $.ajax({/*...*/, success: next)}, 
     function() { $.ajax({/*...*/, success: next)}, 
     function() { $.ajax({/*...*/, success: next)} 
    ]; 
    var index = 0; 
    next(); 

    function next() { 
     if (index < calls.length) { 
      // Do the next, increment the call index 
      calls[index++](); 
     } 
    } 
})(); 
+0

我們可以檢查每個AJAx的輸出嗎調用並相應地調用或避免所有AJAX事件的調用,例如返回false或否? – Vikrant

+0

@Vikrant:如果您正在討論函數循環,那麼沒有理由不能在任何給定的ajax調用上通過'success'或'fail'回調來設置標誌,以儘早停止「循環」。 –

+0

我們可以做一些類似'function(){$ .ajax({/*...*/, success:function(){ ret = false;}, complete:next})} if(ret == true) function(){$ .ajax({/*...*/,complete:next})},...'? – Vikrant