循环范围

时间:2015-11-24 16:05:15

标签: javascript jquery ajax

我刚开始使用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);

编辑:添加了当时的链和代码,我有一个未定义的子页面[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);
                    }
                });
            }
        })

3 个答案:

答案 0 :(得分:1)

您的$('.left.carousel-control').on('click', (e) -> carousel = $(e.currentTarget).data('target') $(carousel).carousel('prev') ) 循环会立即执行循环的所有迭代。在 for的最后一行运行后,填充了subPages数组。

答案 1 :(得分:0)

  

问题是当我在外面时,subPages数组超出了范围   $获得(...)

$.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>

答案 2 :(得分:0)

$.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);
});