簡體   English   中英

Jquery.ajax() 局部變量不能分配給全局

[英]Jquery .ajax() local variable can't assign to global

我有一個 jquery ajax 代碼如下:

$(document).ready(function() {
  var global_arr = new Array();
  $.ajax({
    url: 'result.php',
    type: 'post',
    dataType: 'json',
    success: function(data) {
       $.each(data, function(key, value) {
          global_arr.push(value.name);
       });
       alert(global_arr); //get correct value, works fine
     }
  }); //end of ajax function
  alert(global_arr); //get null, it doesn't work properly
});

請注意警告 global_arr 的行,為什么我無法從 $.ajax() function 中獲取值? 感謝任何人對此的幫助。

Ajax需要時間來完成。 函數執行時間不會太長。 因此,當您在ajax請求之外獲得警報時,ajax請求仍然使用時間來完成(在傳輸或服務器端操作中)。

您始終可以等待ajax方法完成。

$(document).ready(function() {

 var global_arr = new Array();
 var complete = false;//flag to wait for ajax completion
 $.ajax({
  url: 'result.php',
  type: 'post',
  dataType: 'json',
  success: function(data) {
   $.each(data, function(key, value) {
      global_arr.push(value.name);
   });
   alert(global_arr); //get correct value, works fine
   complete = true;//mark ajax as complete
  }
 }); //end of ajax function

 (function runOnComplete(){
  if( complete ){//run when ajax completes and flag is true
   alert(global_arr);
  }else{
   setTimeout(runOnComplete,25);//when ajax is not complete then loop
  }
 })()
});

但是,最常見的方法是使用回調。

$(document).ready(function() {

 function runOnComplete(){//code executes once ajax request is successful
  alert(global_arr);
 }
 var global_arr = new Array();
 $.ajax({
  url: 'result.php',
  type: 'post',
  dataType: 'json',
  success: function(data) {
   $.each(data, function(key, value) {
    global_arr.push(value.name);
   });
   alert(global_arr); //get correct value, works fine
   runOnComplete();//callback
  }
 }); //end of ajax function
});

Ajax是異步的。 當JS引擎到達你的無效alert()行時,AJAX調用還沒有機會從服務器獲得響應並設置變量。

這就是內部alert()有效的原因。 當響應從服務器進入時它會被執行。

那是因為alert(global_arr); //get null, it doesn't work properly alert(global_arr); //get null, it doesn't work properly$.ajax完成之前運行alert(global_arr); //get null, it doesn't work properly

我的建議是將其分解為3個功能,這樣會更有意義。 你需要ajax,handelRequest,onComplete。 您可能還想為您的ajax函數添加錯誤處理程序,因此如果它失敗了,它可以通過鎖定用戶的腳本來完成。

$(document).ready(function () {

    var global_arr = new Array();

    $.ajax({
        url: 'result.php',
        type: 'post',
        dataType: 'json',
        success: handelRequest(data),
        error: handleError             
    });

    function handelRequest(data) {          
        $.each(data, function (key, value) {
            global_arr.push(value.name);
        });
        onComplete(global_arr); //get correct value, works fine
    }

    function onComplete(global_arr){
        // then here you can do what ever you
        // you would like with the array
        alert(global_arr);
    }

    function handleError(){
        // gracefully fail
    }

})

Ajax function runs asynchronously and before ajax function adds incoming data in your array, the outer alert function runs and for this reason alerts an empty array.

您可以使用async-await使外部警報 function 等待傳入數據。

  $(document).ready(async function() {
  var global_arr = new Array();
  await $.ajax({
    url: 'result.php',
    type: 'post',
    dataType: 'json',
    success: function(data) {
       $.each(data, function(key, value) {
          global_arr.push(value.name);
       });
       alert(global_arr);
     }
  }); //end of ajax function
  alert(global_arr); //it will work fine now
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM