jQuery每个循环变量数据都丢失了

时间:2015-11-16 13:40:24

标签: javascript jquery

在jQuery中使用我的变量作用域有点麻烦,如果我在.each循环之外执行console.log怎么办?我在$ stockData上得到一个空数组? (如果我在.each中执行它,它工作正常,每次添加值时都会记录数组)

$(document).ready(function(){
    // stock data will contain all the merged data from the database and yahoo queries
    var $stockData = new Array();

    // get data from yahoo and merge with dbData, add to stockData array
    $.getJSON( "/get_portfolio.php", function(dbData) {
        $.each( dbData, function(index) {
            var stock = dbData[index]
            $.ajax({
                url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%3D%22"+stock.stock_symbol+"%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys",
                crossDomain: true
            }).success(function(data){
                var quote = data.query.results.quote;
                $.extend(quote, stock);
                $stockData.push(quote);
            }); // end success
        });// end each
    }); // end getJSON
    console.log($stockData);
}); // end document.ready

2 个答案:

答案 0 :(得分:2)

致电

$.getJSON( "/get_portfolio.php", function(dbData) { ... });

这一部分:

function(dbData) { ... }

不会立即运行。 JavaScript说:“哦,你做了一个http请求?我会保留你给我的这个功能,并在请求完成后运行它”。其余的代码将继续运行,所以:

console.log($stockData);

将首先运行。所以这里的实际执行顺序是:

  1. 你运行getJSON
  2. console.log运行
  3. HTTP请求完成并且您的回调运行
  4. 将console.log放在getJSON块中,紧跟在.each循环之后:

    $(document).ready(function(){
        // stock data will contain all the merged data from the database and yahoo queries
        var $stockData = new Array();
    
        // get data from yahoo and merge with dbData, add to stockData array
        $.getJSON( "/get_portfolio.php", function(dbData) {
            var requestsDone = 0;
            $.each( dbData, function(index) {
                var stock = dbData[index]
                $.ajax({
                    url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%3D%22"+stock.stock_symbol+"%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys",
                    crossDomain: true
                }).success(function(data){
                    var quote = data.query.results.quote;
                    $.extend(quote, stock);
                    $stockData.push(quote);
                    if(++requestsDone == dbData.length) done();
                }).error(function(){
                    if(++requestsDone == dbData.length) done();
                });
            });// end each
            function done() {
                console.log($stockData); // put this here
            }
        }); // end getJSON
    
    }); // end document.ready
    

答案 1 :(得分:0)

你需要等待getJSON函数完成,试试这个:

$(document).ready(function(){
    // stock data will contain all the merged data from our database and yahoo queries
    var $stockData = new Array();

    // get data from yahoo and merge with dbData, add to stockData array
    $.getJSON( "/get_portfolio.php", function(dbData) {
        $.each( dbData, function(index) {
            var stock = dbData[index]
            $.ajax({
                url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%3D%22"+stock.stock_symbol+"%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys",
                crossDomain: true
            }).success(function(data){
                var quote = data.query.results.quote;
                $.extend(quote, stock);
                $stockData.push(quote);
            }); // end success
        });// end each

        console.log($stockData);

    }); // end getJSON
});