簡體   English   中英

在運行代碼之前等待jQuery $ .get函數完成

[英]Wait for jQuery $.get function to finish before running code

在下面, return語句 $.get()調用完成之前執行。 我怎么能改變這個?

var aft = {};

aft.getToken = function (url) {

    var theToken;

    //Get the token value
    $.get(url, function (data) {

        theToken = $(data).find('input[name=__RequestVerificationToken]').val();

    }, "html");

    return theToken;

};

jQuery支持開箱即用,將選項async設置為false ,函數調用將是同步的,而不是異步的。

雖然我建議您保持請求異步,但請參閱本文末尾的“ 推薦解決方案 ”。

async (Boolean)默認值:true

默認情況下,所有請求都是異步發送的(默認情況下設置為true)。 如果需要同步請求,請將此選項設置為false。 跨域請求和dataType:“jsonp”請求不支持同步操作。

請注意,同步請求可能會暫時鎖定瀏覽器,並在請求處於活動狀態時禁用任何操作。


但我使用$.get ,這似乎是特定於$.ajax

是的,但在引擎蓋下它們完全是一回事。

jQuery.get()

這是一個簡寫的Ajax函數,相當於:

 $.ajax({ url: url, data: data, success: success, dataType: dataType }); 

示例實施

aft.getToken = function (url) {
  var theToken;

  $.ajax({
    url: url,
    dataType: 'html'
    success: function (data) {
      theToken = $(data).find('input[name=__RequestVerificationToken]').val();
    },
    dataType: dataType
  });

  return theToken;
}

推薦解決方案

正如前面提到的來自jQuery文檔的評論所述,通常不建議使用異步請求,並且通常弊大於利。

相反,您應該嘗試使用回調或類似方法來實現所要求的功能。

回調是傳遞給某個其他函數以處理某個事件的函數,例如數據檢索的成功。 正如您在自己的代碼段中將回調傳遞給$.get

使你的函數aft.getToken接受一個名為callback的第二個參數,它應該是一個函數引用。 然后在數據檢索和“解析”完成時,使用您的ajax請求回復的令牌作為參數調用此函數。

aft.getToken = function (url, callback) {
  var dst_object = this;

  $.get (url, function (data) {
    dst_object.stored_token = $(data).find (
      'input[name=__RequestVerificationToken]'
    ).val ();

    callback (dst_object.stored_token);
  }, "html");
};

...

aft.getToken ('/path/to/file.html', function (token) {
  console.log ("Got token: " + token);
});

...

console.log (aft.stored_token);

你不能 - 至少不明智。 雖然你可以在jQuery ajax請求上設置async屬性,但我在過去嘗試使用false值時遇到了嚴重的問題

嘗試重新思考你想要實現的目標:

var aft = { yourToken: '' };

aft.setToken = function (url, callback) {
    $.get(url, function (data) {
        this.yourToken = $(data).find('input[name=__RequestVerificationToken]').val();

        if (callback)
           callback.apply(this);
    }, "html");
};

接着:

aft.setToken("url.php", function() {
   alert("Token retrieved = " + this.yourToken);
});

或者,如果您的回調需要訪問返回的數據,那么您可以更簡單地做

if (callback)
    callback(data);

接着

aft.setToken("url.php", function(dataReturned) {
   alert("Ajax data retrieved = " + dataReturned);
});

code by @Adam Rackis is working for me. @Adam Rackis的代碼對我有用。 實際上,如果url的內容是json結構,你可以直接引用這樣的字段。 請注意,aft = {yourToken:''}只是假的,因為我根本沒有使用這個字典中的值。 我只是想從URL獲取user_id。

var aft = { yourToken: '' };
    aft.setToken = function(url, callback){
        $.get(url, function(data) {
            user_id = data[0]['user_id'];
            if (callback)
                callback(data);
        });
    };

    aft.setToken("https://XXXXXX.azurewebsites.net/.auth/me",  function(dataReturned){
        alert("You user id is " + labeler);

暫無
暫無

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

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