Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何执行该方法直到每个Ajax方法都获得数据_Jquery - Fatal编程技术网

Jquery 如何执行该方法直到每个Ajax方法都获得数据

Jquery 如何执行该方法直到每个Ajax方法都获得数据,jquery,Jquery,我有一个日志方法,它需要执行,直到ajax方法getUserIP获得值为止。 getUserIP将在$document.ready()方法中运行,在其success方法中,它将运行另一个名为getsas方法的ajax方法。 代码如下: var userIP,sasToken,isReady; $(document).ready(function ( ) { getUserIP(); }); function getUserIP() { if (!userIP) {

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

非常感谢

您可以将
insertEntity
放入
getSAS
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);
        }
    });
}

另一种方法是使用它,它可以在延迟对象完成时执行回调。

首先,将AJAX调用分离为除了发出单个AJAX请求之外什么都不做的函数,然后
返回
jqXHR
值:

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

function getSAS(userIp) {
     return $.ajax(...);
}
注意使用
.then
来“过滤”来自第一个AJAX调用的返回值,以便它只返回所需的IP地址,而不是整个
数据结构

然后,您将需要一个函数,该函数尝试每分钟获取一次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();
}
然后您可以使用
。然后
完成
将其链接在一起:

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

您可能需要使用jQuerys ajaxStop()方法。有关示例和文档,请参阅。

查找jQuery
when()
:您真的打算无限期地调用
getSAS
?您永远不会取消
setInterval
循环。是的,我需要每分钟调用一次
时通常最适合用于在解析多个延迟对象时执行回调。同意,但我们也可以将延迟从一个上下文传递到另一个上下文,以便在
时通过
附加各种回调。但是,在我的情况下,如果我想要在$(document).ready()中运行ajax调用,并且想要在第一个ajax的基础上运行第二个ajax,我应该怎么做?您已经完成了第一步-从第一个ajax的回调调用第二个ajax。现在您只需要从第二个ajax的回调调用一个函数(两个ajax请求完成后应该调用该函数)。非常感谢!这似乎是我要找的!我会先检查它。我只是稍微修改了一下,这样即使第一个令牌被返回,
getsas实际上每分钟都会被调用一次。