2013-07-16 52 views
0

我想打電話給後結束通話前一個變化的方法是這樣的變化()方法:等待完成方法改變以往執行,以執行另一個

$('#editMPS_structure .alcanceMarca').find('.marca').val(enlaceMarca).change(); 
$('#editMPS_structure .alcanceProducto').find('.producto').change(); 


$('.marca').on('change', function() { 
    $.ajax({ //ajax call to populate .producto select according a value of marca }) 
}) 

$('.producto').on('change', function() { 
    $.ajax({ //ajax call}) 
}) 

但問題是,調用第二個變化()方法.alcanceProducto沒有完成第一個change()方法,我需要在完成第一個更改()後立即調用第二個change()。

我不想把第二次調用改變()在第一個Ajax變化(),但我認爲存在其他方法或函數來做到這一點。

回答

-1

舉行.producto的change事件的設置,直到第一個Ajax調用的respose完成

$('.marca').on('change', function() { 
    $.ajax({ //.... }) 
     .done(function() { 
     $('.producto').on('change', function() { 
      $.ajax({ //ajax call}) 
1

你有幾個選項(這取決於需求和代碼的複雜性)。第一,比較幼稚:

  • 讓我們設置asyncfalseajax()要求,下一行代碼就不會被執行,直到第一個請求已完成(但你的頁面不會刷新過)。我們把第二個調用放在第一個調用的回調函數(或者其中一個jQuery幫助器方法)中(這樣它會在第一次調用結束時執行)。
  • 讓我們使用jQuery的when函數(它模仿您可以手寫的請求鏈)。

如果你的代碼路徑不那麼直接和/或你必須處理更棘手的情況(例如,當用戶操作可能啓動多個請求時),你必須創建自己的列表。

每個on('change')處理程序都不會啓動請求,但會將其放入FIFO中,然後它會彈出第一個條目並執行該請求。在回調函數中,它會彈出下一個(如果有多個請求已經排隊,等等)。您可以從this link開始工作。

0

我會首先創建功能爲您的AJAX調用方式如下:

function ajax1(endFunc){ 
    $.ajax({ //ajax call to populate .producto select according a value of marca }) 
    .done(function(){ 
     if(typeof endFunc === "function") 
      endFunc(); 
    }); 
} 

function ajax2(){ 
    $.ajax({ //ajax call}) 
} 

,那麼我會寫:

ajax1(ajax2); 

代替:

('#editMPS_structure .alcanceMarca').find('.marca').val(enlaceMarca).change(); 
$('#editMPS_structure .alcanceProducto').find('.producto').change(); 

不要忘記與onchanges鏈接你的新功能:

$('.marca').on('change', ajax1); 
$('.producto').on('change', ajax2); 

這將是我的解決方案。不幸的是我現在無法測試它,但我認爲它應該可以工作。讓我知道 !

0

只需拿着推遲從Ajax調用中的變量返回,並調用來完成()上,看看它的完成:

var ajax = $.ajax(); // avoids calling done() on undefined 

$('.marca').on('change', function() { 
    ajax = $.ajax({ 
     url: 'something' 
    }).done(function(data) { 
     console.log('first'); // will always complete before the next one 
    }); 
}); 

$('.producto').on('change', function() { 
    ajax.done(function() { 
     $.ajax({ 
      url: 'something' 
     }).done(function(data) { 
      console.log('second'); // will always complete after the first one 
     }); 
    }); 
}); 

FIDDLE