Javascript 使用jQuery一个接一个地发送AJAX调用
在循环和数组对象时,我在一个接一个地发送AJAX调用时遇到问题。代码如下Javascript 使用jQuery一个接一个地发送AJAX调用,javascript,jquery,ajax,facebook-graph-api,Javascript,Jquery,Ajax,Facebook Graph Api,在循环和数组对象时,我在一个接一个地发送AJAX调用时遇到问题。代码如下 var def = true; $.each(urls, function(index, val) { var postResult = $.Deferred(); link = 'http://myurl.com' + val.aslug + '/' + val.slug; $.when(def).then(function(){
var def = true;
$.each(urls, function(index, val) {
var postResult = $.Deferred();
link = 'http://myurl.com' + val.aslug + '/' + val.slug;
$.when(def).then(function(){
$.post('https://graph.facebook.com ', {id : link, scrape : 'true' }, function(data, textStatus, xhr) {
}).always(function(){
postResult.resolve(5);
});
});
def = postResult;
});
问题是第一次和第二次打电话都没问题。但是第三次调用和以下调用与第二次调用相同:/I我认为每个调用都不会更改为下一个对象在这种情况下,最简单的方法是: 将变量链接分配移动到“when-then”构造中
var def = true;
$.each(urls, function(index, val) {
var postResult = $.Deferred();
$.when(def).then(function(){
var link = 'http://myurl.com' + val.aslug + '/' + val.slug;
$.post('https://graph.facebook.com ', {id : link, scrape : 'true' }, function(data, textStatus, xhr) {
}).always(function(){
postResult.resolve(5);
});
});
def = postResult;
});
您之所以出现此问题,是因为JS异步能力。$。当“延迟的代码段”运行时,每个()循环都不会等待。它在数组中循环,并创建一个将要执行的任务队列
您也可以考虑使用<代码> $.Ajax < /C> >选项>代码>异步:false < />代码,而不是
,在这种情况下最简单的方式是: 将变量链接分配移动到“when-then”构造中var def = true;
$.each(urls, function(index, val) {
var postResult = $.Deferred();
$.when(def).then(function(){
var link = 'http://myurl.com' + val.aslug + '/' + val.slug;
$.post('https://graph.facebook.com ', {id : link, scrape : 'true' }, function(data, textStatus, xhr) {
}).always(function(){
postResult.resolve(5);
});
});
def = postResult;
});
您之所以出现此问题,是因为JS异步能力。$。当“延迟的代码段”运行时,每个()循环都不会等待。它在数组中循环,并创建一个将要执行的任务队列
您也可以考虑使用<代码> $.Ajax < /C> >选项>代码>异步:false < />代码,而不是
,在这种情况下最简单的方式是: 将变量链接分配移动到“when-then”构造中var def = true;
$.each(urls, function(index, val) {
var postResult = $.Deferred();
$.when(def).then(function(){
var link = 'http://myurl.com' + val.aslug + '/' + val.slug;
$.post('https://graph.facebook.com ', {id : link, scrape : 'true' }, function(data, textStatus, xhr) {
}).always(function(){
postResult.resolve(5);
});
});
def = postResult;
});
您之所以出现此问题,是因为JS异步能力。$。当“延迟的代码段”运行时,每个()循环都不会等待。它在数组中循环,并创建一个将要执行的任务队列
您也可以考虑使用<代码> $.Ajax < /C> >选项>代码>异步:false < />代码,而不是
,在这种情况下最简单的方式是: 将变量链接分配移动到“when-then”构造中var def = true;
$.each(urls, function(index, val) {
var postResult = $.Deferred();
$.when(def).then(function(){
var link = 'http://myurl.com' + val.aslug + '/' + val.slug;
$.post('https://graph.facebook.com ', {id : link, scrape : 'true' }, function(data, textStatus, xhr) {
}).always(function(){
postResult.resolve(5);
});
});
def = postResult;
});
您之所以出现此问题,是因为JS异步能力。$。当“延迟的代码段”运行时,每个()循环都不会等待。它在数组中循环,并创建一个将要执行的任务队列
您也可以考虑使用<代码> $Ajax < /C> >选项>代码>异步:false ,而不是
您的直觉是正确的,最大的问题是您不想在循环中创建函数。当第二次解析时,该闭包中的链接
变量将不再引用正确的值。这就是为什么你会收到一堆对同一个url的调用
此外,要创建一系列承诺,您需要使用如下内容:(不确定jQuery承诺是否具有类似的功能)
示例代码:
// not sure if this is necessary
// haven't used jQuery promises much
var result = $.when(true);
mapUrlsToPosts(urls).forEach(function(f) {
result = result.then(f);
});
function mapUrlsToPosts(urls) {
return urls.map(function(url) {
// create a function that when executed will make a request to the desired url
return post.bind(null, url);
});
}
function post(val) {
var link = 'http://myurl.com' + val.aslug + '/' + val.slug,
postResult = $.Deferred(),
params = {
link: link,
scrape: 'true'
};
$.post('https://graph.facebook.com ', params, function(data, textStatus, xhr) {
}).always(function(){
postResult.resolve(5);
});
return postResult;
}
编辑:顺便说一下,如果您不需要等待上一个请求完成后再进行下一个请求,那么所有这些都可以简化。这里的大部分复杂性来自对请求的排队。你的直觉是正确的-最大的问题是你不想在循环中创建函数。当第二次解析时,该闭包中的
链接
变量将不再引用正确的值。这就是为什么你会收到一堆对同一个url的调用
此外,要创建一系列承诺,您需要使用如下内容:(不确定jQuery承诺是否具有类似的功能)
示例代码:
// not sure if this is necessary
// haven't used jQuery promises much
var result = $.when(true);
mapUrlsToPosts(urls).forEach(function(f) {
result = result.then(f);
});
function mapUrlsToPosts(urls) {
return urls.map(function(url) {
// create a function that when executed will make a request to the desired url
return post.bind(null, url);
});
}
function post(val) {
var link = 'http://myurl.com' + val.aslug + '/' + val.slug,
postResult = $.Deferred(),
params = {
link: link,
scrape: 'true'
};
$.post('https://graph.facebook.com ', params, function(data, textStatus, xhr) {
}).always(function(){
postResult.resolve(5);
});
return postResult;
}
编辑:顺便说一下,如果您不需要等待上一个请求完成后再进行下一个请求,那么所有这些都可以简化。这里的大部分复杂性来自对请求的排队。你的直觉是正确的-最大的问题是你不想在循环中创建函数。当第二次解析时,该闭包中的
链接
变量将不再引用正确的值。这就是为什么你会收到一堆对同一个url的调用
此外,要创建一系列承诺,您需要使用如下内容:(不确定jQuery承诺是否具有类似的功能)
示例代码:
// not sure if this is necessary
// haven't used jQuery promises much
var result = $.when(true);
mapUrlsToPosts(urls).forEach(function(f) {
result = result.then(f);
});
function mapUrlsToPosts(urls) {
return urls.map(function(url) {
// create a function that when executed will make a request to the desired url
return post.bind(null, url);
});
}
function post(val) {
var link = 'http://myurl.com' + val.aslug + '/' + val.slug,
postResult = $.Deferred(),
params = {
link: link,
scrape: 'true'
};
$.post('https://graph.facebook.com ', params, function(data, textStatus, xhr) {
}).always(function(){
postResult.resolve(5);
});
return postResult;
}
编辑:顺便说一下,如果您不需要等待上一个请求完成后再进行下一个请求,那么所有这些都可以简化。这里的大部分复杂性来自对请求的排队。你的直觉是正确的-最大的问题是你不想在循环中创建函数。当第二次解析时,该闭包中的
链接
变量将不再引用正确的值。这就是为什么你会收到一堆对同一个url的调用
此外,要创建一系列承诺,您需要使用如下内容:(不确定jQuery承诺是否具有类似的功能)
示例代码:
// not sure if this is necessary
// haven't used jQuery promises much
var result = $.when(true);
mapUrlsToPosts(urls).forEach(function(f) {
result = result.then(f);
});
function mapUrlsToPosts(urls) {
return urls.map(function(url) {
// create a function that when executed will make a request to the desired url
return post.bind(null, url);
});
}
function post(val) {
var link = 'http://myurl.com' + val.aslug + '/' + val.slug,
postResult = $.Deferred(),
params = {
link: link,
scrape: 'true'
};
$.post('https://graph.facebook.com ', params, function(data, textStatus, xhr) {
}).always(function(){
postResult.resolve(5);
});
return postResult;
}
编辑:顺便说一下,如果您不需要等待上一个请求完成后再进行下一个请求,那么所有这些都可以简化。这里的大部分复杂性来自于对请求进行排队。我们可以看到什么定义了
url
?为什么postResult.resolve(5)代码>?与论坛网站不同,我们不会在网站上使用“谢谢”或“感谢任何帮助”或签名。请参阅“'URL'这是一个简单的对象数组。抱歉@JohnSaunders不知道这一点。我们可以看看是什么定义了URL
?为什么postResult.resolve(5);
?与论坛网站不同,我们不使用“感谢”或“感谢任何帮助”或签名。请参阅“'URL”这是一个简单的对象数组。抱歉@JohnSaunders不知道这一点,我们可以看看是什么定义了url
?为什么postResult.resolve(5)代码>?与论坛网站不同,我们不会在网站上使用“谢谢”或“感谢任何帮助”或签名。请参阅“'URL'这是一个简单的对象数组。抱歉@JohnSaunders不知道这一点。我们可以看看是什么定义了URL
?为什么postResult.resolve(5);
?与论坛网站不同,我们不使用“感谢”或“感谢任何帮助”或签名。请参阅“'URL”这是一个简单的对象数组。抱歉@JohnSaunders不知道这一点