我是JS的新手,所以如果我有任何错误,请原谅我。
我在数组中有一个“未知”数量的URL,我必须使用Ajax,但不是异步。我想让它们一个接一个地被检索,但我现在的代码同时发射所有内容。
感谢任何帮助 - 我目前的代码如下所示:
urls = ["http://www.google.com/", "http://www.yahoo.com", "http://www.bing.com"] // the number of urls in this array changes
var gets = []
$.each(urls, function(index, url) {
gets.push($.ajax({
url: url
}));
});
答案 0 :(得分:1)
因为ajax返回一个promise,你可以通过下一次调用链获取结果。
var urls = ["http://www.google.com/", "http://www.yahoo.com", "http://www.bing.com"]
(function(arrayurls, index) {
if(index >= arrayurls.length) return;
var url = arrayurls[index];
var thisfunction = arguments.callee;
$.ajax({ url: url }).done(function(result) {
//Do something with the result.
thisfunction(arrayurls, index + 1) // Reinvoke the function over different arguments.
});
})(urls, 0);
命名变种以摆脱arguments.callee
:
var handle = function(arrayurls: string[], index: number) {
if(index >= arrayurls.length) return;
var url = arrayurls[index];
$.ajax({ url: url }).done(function(result) {
//Do something with the result.
handle(arrayurls, index + 1) // Reinvoke the request over the next URL arguments.
});
};
handle(urls, 0);
如果在进行此调用时网址的数量会随时间发生变化,您始终可以使用urls.slice(0)
复制网址数组;
答案 1 :(得分:0)
您可以通过ajax调用传递async=false
参数。这使得下一个ajax调用等待上一次调用完成。像下面的代码应该工作:
$.ajax({
url : url,
type : "get",
async : false,
success : function(data) {
your logic
}
});
答案 2 :(得分:0)
看看:https://stackoverflow.com/a/4785886/2561834。您需要一个类/函数来处理您的请求堆栈。
答案 3 :(得分:-1)
您可以设置async: false
。 Docs