Jquery 如何执行该方法直到每个Ajax方法都获得数据
我有一个日志方法,它需要执行,直到ajax方法getUserIP获得值为止。 getUserIP将在$document.ready()方法中运行,在其success方法中,它将运行另一个名为getsas方法的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) {
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()方法。有关示例和文档,请参阅。查找jQuerywhen()
:您真的打算无限期地调用getSAS
?您永远不会取消setInterval
循环。是的,我需要每分钟调用一次。时通常最适合用于在解析多个延迟对象时执行回调。同意,但我们也可以将延迟从一个上下文传递到另一个上下文,以便在时通过附加各种回调。但是,在我的情况下,如果我想要在$(document).ready()中运行ajax调用,并且想要在第一个ajax的基础上运行第二个ajax,我应该怎么做?您已经完成了第一步-从第一个ajax的回调调用第二个ajax。现在您只需要从第二个ajax的回调调用一个函数(两个ajax请求完成后应该调用该函数)。非常感谢!这似乎是我要找的!我会先检查它。我只是稍微修改了一下,这样即使第一个令牌被返回,getsas实际上每分钟都会被调用一次。