2013-07-10 19 views
0

我有一個需要執行的日誌方法,直到ajax方法:getUserIP獲取值。 getUserIP將在$ document.ready()方法中運行,並且在其成功方法中,它將運行另一個名爲getsas方法的ajax方法。 這樣的代碼:如何執行該方法,直到每個Ajax方法獲取數據

var userIP,sasToken,isReady; 
$(document).ready(function () { 
    getUserIP(); 
}); 

function getUserIP() { 
    if (!userIP) { 
     $.ajax({ 
      type: "GET", 
      url: "http://jsonip.com?callback=?", 
      dataType: "jsonp", 
      jsonp: "callback", 
      jsonCallback: "jsonCallBack", 
      success: function (data) { 
       callback(data); 
       getSASEveryMinute(); 
      } 
     }); 
    } 
} 
//Handle the response data from jsonip and SASTokenService.svc 
//save them in globle varible 
function callback(data) { 
    if (data.ip) 
     userIP = data.ip 
    else { 
     sasToken = data.sasToken; 
     isReady = true; 
    } 
} 
function getSASEveryMinute() { 
    url = "http://asdfasdf/TokenService.svc/json/Logs/" + userIP; 
    getSAS(); 
    function getSAS() { 
     $.ajax({ 
      url: url, 
      type: 'GET', 
      dataType: "jsonp", 
      jsonp: "callback", 
      jsonpCallback: "jsonCallback", 
      success: function (data) { 
       callback(data); 

      } 
     }); 
    } 
    setInterval(function() { 
     getSAS(); 
    }, 60000); 
} 


function insertEntity(entity) { 
     if (isReady) { 
      entity.PartitionKey = userIP; 
      insert(entity);  
     } 
     else { 
      setTimeout(function() { insertEntity(entity) }, 2000); 
     } 

我們是否有更好的方法,然後

setTimeout(function() { insertEntity(entity) }, 2000); 

非常感謝!

+1

尋找jQuery'when()':http://api.jquery.com/jQuery.when/ – mishik

+0

你真的打算讓'getSAS'調用ad-infinitum嗎?你永遠不會取消'setInterval'循環。 – Alnitak

+0

是的,我需要每分鐘撥打電話 – EthenHY

回答

0

首先,分離出你的AJAX調用成做什麼除了代替單一AJAX請求的功能,然後returnjqXHR值:

function getUserIp() { 
    return $.ajax(...).then(function(data) { 
     return data.ip; 
    }); 
} 

function getSAS(userIp) { 
    return $.ajax(...); 
} 

注意使用.then「過濾」的迴歸來自第一個AJAX調用的值,以便它僅返回所需的IP地址,而不是整個data結構。

然後,您需要的是嘗試獲取SAS每分鐘一次令牌功能,但不「解決」的諾言,直到它有它:

function getSASRepeatedly(userIp) { 
    var def = $.Deferred(); 

    (function loop() { 
     getSAS(userIp).done(function(data) { 
      if (data.sasToken) { 
       def.resolve(userIp, data.sasToken); 
      } 
      setTimeout(loop, 60000); // do it again 
     }); 
    )(); 

    return def.promise(); 
} 

然後你可以使用.then.done鏈接起來:

getUserIp().then(getSASRepeatedly).done(function(ip, token) { 
    // do your insert here 
}); 
+0

非常感謝!這看起來像我在找什麼! 我會先檢查一下。 – EthenHY

+0

我剛剛修改了這個,所以即使返回第一個標記,也會每分鐘調用一次'getSASRepeatedly'。 – Alnitak

0

你可以把insertEntitygetSAS Ajax回調:

function getSAS() { 
    $.ajax({ 
     url: url, 
     type: 'GET', 
     dataType: "jsonp", 
     jsonp: "callback", 
     jsonpCallback: "jsonCallback", 
     success: function (data) { 
      callback(data); 
      // Get the entity, if it's not global 
      insertEntity(entity); 
     } 
    }); 
} 

另一種方法是使用when()可以執行一個回調時遞延對象完成。

+0

'.when'通常最適合用來在解決_multiple_延遲對象時執行回調。 – Alnitak

+0

同意,但我們也可以將從一個上下文延期傳遞給另一個,以通過'when'附加各種回調。 – mishik

+0

但在我的情況下,如果我想在$(document).ready()中運行ajax調用,並且想要基於第一個ajax的第二個ajax,我該怎麼辦? – EthenHY