2013-10-04 37 views
1

當我更新到版本1.10.2時,我開始有一些jQuery問題。jQuery - 等到函數返回,然後繼續

我一直在尋找答案,但沒有一種方法似乎工作,我可能做錯了什麼。我真的很感謝一些幫助。

主要問題是click事件不會等待validateAjax的結果,而只是說validateBaan是未定義的。我已經檢查了validateAjax函數並且輸出獲取了true或者false的值,但是我估計那時點擊事件已經移動了。我希望click事件等待validateAjax結果,然後繼續。

Click事件:

$('#log-in').on('click', function() { 

    // triggers validateAjax 
    var validateBaan = validateAjax('fieldId', 'worker'); 

    // every time I log it says undefined, even though it gets value 
    // (true or false), but too late 
    // console.log(validateBaan); 

    // this function works 
    var validateShift = checkInput({ 
     shift: { 
      field: 'btn-group', 
      hasClass: 'active', 
      error: 'shifterror' 
     } 
    }); 
    // when both are true take some action 
    if (validateBaan && validateShift) { 
     ... 
    } 
}); 

這裏是validateAjax功能:

function validateAjax(fieldId, query) { 

    var output; 

    // field value 
    var fieldValue = $('#' + fieldId).val(); 

    // sending ajax request 
    var ajaxQuery = $.ajax({ 
    type: "GET", 
    url: "update.php", 
    data: 'checkup=checkup&baan=' + fieldValue 
    }); 

    // based on the response, takes action 
    ajaxQuery.done(function(response) { 
     if (response.error) { 
      output = false; 
      $('.error-' + fieldId).html(response.error); 
     } else if (response.product) { 
      $.cookie('tab_name', response.product); 
      output = true; 
     } else { 
      output = true; 
     } 
     return output; 
    }); 
} 

我已經使用jQuery的時候/然後試過,但我沒能得到它的工作。

我從來沒有像這樣的老問題jQuery版本的問題,所以我將不勝感激所有幫助。

回答

3

您可以使用回撥功能,如

$('#log-in').on('click', function() { 

    // triggers validateAjax 
    // pass anonymus function to be called when ajax is complete 
    var validateBaan = validateAjax('fieldId', 'worker', function(){ 

     // every time I log it says undefined, even though it gets value 
     // (true or false), but too late 
     // console.log(validateBaan); 

     // this function works 
     var validateShift = checkInput({ 
      shift: { 
       field: 'btn-group', 
       hasClass: 'active', 
       error: 'shifterror' 
      } 
     }); 
     // when both are true take some action 
     if (validateShift) { 
      ... 
     } 
    }); 
}); 


function validateAjax(fieldId, query, callback) { 
    var output; 

    // field value 
    var fieldValue = $('#' + fieldId).val(); 

    // sending ajax request 
    var ajaxQuery = $.ajax({ 
    type: "GET", 
    url: "update.php", 
    data: 'checkup=checkup&baan=' + fieldValue 
    }); 

    // based on the response, takes action 
    ajaxQuery.done(function(response) { 
     if (response.error) { 
      output = false; 
      $('.error-' + fieldId).html(response.error); 
     } else if (response.product) { 
      $.cookie('tab_name', response.product); 

      //Call you function if condition is trure 
      callback(); 
     } 
    }); 
} 
+0

Okei,謝謝,試試看。 – Myt

+0

Jeei,它的工作,非常感謝。現在我知道我需要使用回調來完成這些工作。再一次,謝謝你! – Myt

+1

這個答案可以工作,但不需要傳遞迴調。由於'$ .ajax()'返回的對象是promise兼容的,它可以從'validateAjax()'返回,並返回到登錄點擊處理程序中,用鏈接的.done() -callback函數作爲其第一個(也是唯一的)參數。 nett效應是相同的,但這是jQuery 1.7+做事的方式。 Myt,請問你是否想要完整的代碼,我將作爲一個單獨的答案發布 –

0

是,一個AJAX,那麼你可以嘗試使用async: false

設置async to false聲明你正在呼籲有 完全在你的函數的下一條語句可以被稱爲前。

由於過時,最有效的方法是使用callback函數來處理它。

+2

因爲jQuery的1.8異步已被棄用,這就是爲什麼我有這樣的煩惱。 – Myt

+0

...以及它被棄用的原因是Javascript中冗長的同步調用是一個非常糟糕的主意。學習使用回調:) –

+0

@我同意,然後去回調函數。出於一個快速原因,我發現這個http://stackoverflow.com/a/18268209/1671639 – Praveen

0

異步設置爲false:

var ajaxQuery = $.ajax({ 
async: false, 
type: "GET", 
url: "update.php", 
data: 'checkup=checkup&baan=' + fieldValue 
}); 

這將等到AJAX命令與你的代碼前圍完成。

+1

由於jQuery 1.8異步被棄用。 – Myt

+1

不要使用同步AJAX來解決問題。這不是他們正確做事的方式(因此被棄用)。 Javascript被設計爲異步執行大部分事情,所以學會如何使用它:) –

相關問題