for循环范围内的jQuery$.get()
jQuery $.get() within for loop scope
我是AJAX的新手,但在过去的两个小时里,我一直在研究它,以帮助我的场景。我没有取得任何进展(
无论如何,我的问题是,当我在$.get(…)之外时,subPages数组超出了范围。我曾尝试在代码中使用when()和done(),但仍然无法正确执行。
我认为问题在于通过for循环的迭代,因为我在代码的多个部分中都有页面[I]。这就是为什么我不能在需要时使用when()和done()。
这是我的:
var subPages = [];
var containsSub = '/sites/Pages/';
var tempString = '';
// iterate through the pages array in reverse
for(var i = pages.length - 1; i >= 0; i--){
// grab all <a> within response text
var getLinks = $.get(baseURL + pages[i]).then(function(responseData){
var $response = $(responseData);
var $links = $response.find('a');
// push each valid link into subPages array
$links.each(function(index, $link){
if(this.href.indexOf(containsSub) > -1){
subPages.push(this.href);
}
});
// subPages array is loaded with the correct values
console.log("subPages inside get: " + subPages);
});
// empty here
console.log("subPages outstide all: " + subPages);
编辑:添加了then链和代码,我有一个未定义的subPages[I]
var subPages = [];
var containsSub = '/sites/Pages/';
var tempString = '';
// iterate through the pages array in reverse
for(var i = pages.length - 1; i >= 0; i--){
// grab all <a> within response text
var getLinks = $.get(baseURL + pages[i]).then(function(responseData){
var $response = $(responseData);
var $links = $response.find('a');
// push each valid link into subPages array
$links.each(function(index, $link){
if(this.href.indexOf(containsSub) > -1){
subPages.push(this.href);
//console.log("<a href='"+ this.href + "'>" + this.href + "</a>" + " <br>");
}
});
console.log("subPages inside get: " + subPages);
})
.then(function(){
console.log("subPages outstide all: " + subPages);
// print bold for current main page
tempString += "<strong><a href='"+ baseURL + pages[i] + "'>" + pages[i].substr(27,pages[i].length) + "</a><strong>" + " <br>";
for(var i = 0; i < subPages.length - 1; i++){
console.log("<a href='"+ subPages[i] + "'>" + subPages[i] + "</a>" + " <br>");
}
subPages = [];
pages.splice(i, 1);
})
}
11/25编辑:我通过消除一些复杂的问题解决了下面的问题,并决定AJAX请求更符合逻辑。
var subPages = [];
var containsSub = '/sites/it/InfoProtect/Pages/';
var tempString = '';
// iterate through the pages array in reverse
for(var i = pages.length - 1; i >= 0; i--){
// grab all <a> within response text
var getLinks = $.ajax({
url: baseURL + pages[i],
async: false,
success: function(responseData){
var $response = $(responseData);
var $links = $response.find('a');
// push each valid link into subPages array
$links.each(function(index, $link){
if(this.href.indexOf(containsSub) > -1){
subPages.push(this.href);
}
});
}
})
for
循环立即执行循环的所有迭代。console.log
的最后一行运行完毕后,将填充subPages
数组。
$.get
是异步的,因此在调用它之后,.then
内部的代码不会立即被调用。因此,它继续到循环的下一次迭代,最终退出,并显示一个空的subpages
数组,因为您的数据尚未返回。
以下是如何在记录数组(未经测试)之前等待ajax调用的快速想法:
var ajaxCalls = [];
// iterate through the pages array in reverse
for(var i = pages.length - 1; i >= 0; i--){
// grab all <a> within response text
var getLinks = $.get(baseURL + pages[i]).then(function(responseData){
var $response = $(responseData);
var $links = $response.find('a');
// push each valid link into subPages array
$links.each(function(index, $link){
if(this.href.indexOf(containsSub) > -1){
subPages.push(this.href);
}
});
// subPages array is loaded with the correct values
console.log("subPages inside get: " + subPages);
});
ajaxCalls.push(getLinks);
}
$.when.apply(null, ajaxCalls).then(function() {
// not empty here
console.log("subPages outstide all: " + subPages);
});
问题是当我在外面时,subPages数组超出了作用域$.get(…)
$.get()
返回异步响应。尝试将.then()
链接到$.get()
以保持与初始.then()
相同的范围
var getLinks = $.get(baseURL + pages[i]).then(function(responseData){
})
.then(function() {
console.log("subPages outstide all: " + subPages);
})
尝试在for
循环中创建IIFE以通过i
例如
var pages = ["a", "b", "c"];
for(var i = pages.length -1; i >= 0; i--) {
(function(j) {
var dfd = $.Deferred(function(d) {
setTimeout(function() {
d.resolve(j)
}, Math.random() * 1000)
}).promise()
.then(function(n) {
console.log("first", n, pages[n]);
return n
}).then(function(res) {
console.log("second", res, pages[res])
})
}(i))
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
相关文章:
- jQuery Ajax GET请求工作不正常
- 使用Javascript/JQuery获取JSON GET数据
- 如何使Jquery编码的动态下拉菜单与PHP GET变量协调工作
- jquery select()/window.get选择仅在鼠标抬起后更新
- 为什么有些jQuery程序员使用像$.get、$.getJSON和$.when这样的jQuery函数来代替$.ajax
- jQuery在$.get数据完成后执行作业
- Jquery Ajax POST不工作.适用于GET
- 在发布后调用jQuery Get
- How can I get and replace this in javascript ( jquery?
- jQuery load()回调导致POST而不是GET
- 在jQuery中使用GET和POST
- Codeigniter JQuery在JQuery.get请求后动态加载视图中的数据
- 错误Jquery.$.get()请求
- JQuery AJAX 在 GET 请求完成时返回 XML
- PHP $_GET with jQuery $.get call
- JQuery - get(0) undefined
- 使用$.get-Jquery Mobile加载弹出窗口
- $.get jquery 中的未定义返回
- getJSON async with get - jquery
- 由于异步 .get jQuery 函数导致的表布局错误