簡體   English   中英

jQuery.ajax()成功回調存儲數據返回

[英]jQuery.ajax() success callback store data to return

我正試圖從項目中的PHP腳本中獲取一些數據。 我發現搜索AJAX回調函數的所有示例都“使用”回調本身已有的數據,但我想獲取數據並以准備返回的方式存儲它。

function getEle (id) {
    var element = []; 

    $.ajax({
        url: 'slides.php',
        type: 'POST',
        data: {"id": id},
        success: function(data) {
            var content = data;

            element[0] = id;
            element[1] = content;
            // if I alert(element[1]); here it will work! 



        }
    });
    alert(element[1]); // here it just won't :/ ("undefined")
    return element;
}

在我的腳本的某個地方,某些功能需要getEle(ments)但我得到的都是undefined 有辦法做我想要的嗎? 或者有更好的方法可以做到這一點?

解決方案是將回調函數傳遞給getEle()

getEle(id, callback){
  $.ajax({
    /* some options, */
    success: function(){
      var content = data;
      element[0] = id;
      element[1] = content;
      callback(element);
    }
  })
}

然后傳遞一個函數,其中包含元素內容時要執行的操作的代碼:

getEle('myId', function(element){
  alert(element[1]);
});

這里有兩件事情失敗了:

  • 變量范圍 -您定義的AJAX回調里面的變量的內容。 這使得它無法從周圍的代碼中訪問。 您可以省略var ,只需編寫content = data ,這樣可以全局訪問。
  • Asynchronicity - Becaus AJAX是異步的,回調后的腳本將在執行回調之前執行。 解決該問題的唯一方法是按預期使用回調。

看看這個。

function getEle (id, callback) {
        var element = []; 

        $.ajax({
            url: 'slides.php',
            type: 'POST',
            data: {"id": id},
            success: function(data) {
                var content = data;
                element[0] = id;
                element[1] = content;

                callback(element);
            }
        });
    }
}

getEle ("someID", function(someElement) {
    alert(someElement);
});

以下是您的代碼中發生的情況:

  • 數組“元素”被初始化。
  • AJAX調用是通過成功回調函數完成的
  • 當它正在等待AJAX​​運行時,它會繼續執行其余的代碼和警報元素[1],但它還不存在
  • 成功回調運行並填充數組“元素”。

您可以考慮使用全局變量來解決此問題:

var element = []; 

function getEle (id) {
    $.ajax({
        url: 'slides.php',
        type: 'POST',
        data: {"id": id},
        success: function(data) {
            var content = data;
            element[0] = id;      // the global "element" is set
            element[1] = content;
        }
    });
}
// element[0] will exist now, but only after the AJAX call is complete

或者,您可以將AJAX轉換為同步調用:

function getEle (id) {
    var element = []; 

    $.ajax({
        async: false,   // forces synchronous call
        url: 'slides.php',
        type: 'POST',
        data: {"id": id},
        success: function(data) {
            var content = data;
            element[0] = id;
            element[1] = content;
        }
    });
    alert(element[1]); // now it is set
    return element;
}

我能看到的唯一另一個選擇是將所有內容保持在“成功”回調中,你已經發現它可以正常工作。

在其余代碼完成后,您的回調會執行一段時間。

你需要使用回調傳遞值,就像$.ajax那樣。

您的警報最終未定義,因為AJAX調用是異步的。 因此,當AJAX調用正在等待服務器的響應時,腳本將繼續執行警報,此時尚未定義element[1]

您應該將return element行放在success回調函數中。

暫無
暫無

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

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