0

我有一个需要执行的日志方法,直到 ajax 方法:getUserIP 获取值。getUserIP 将在 $document.ready() 方法中运行,在其成功方法中,它将运行另一个名为 getsas 方法的 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);

非常感谢!

4

3 回答 3

0

您可以只放入insertEntityajaxgetSAS回调:

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(),它可以在延迟对象完成时执行回调。

于 2013-07-10T08:08:14.183 回答
0

您可能想使用 jQuerys ajaxStop() 方法。有关示例和文档,请参阅http://api.jquery.com/ajaxStop/

于 2013-07-11T11:08:00.310 回答
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();
}

然后你可以使用.thenand.done将它们链接在一起:

getUserIp().then(getSASRepeatedly).done(function(ip, token) {
    // do your insert here
});
于 2013-07-10T08:30:06.093 回答