Javascript jQuery会丢失每个循环变量的数据

Javascript jQuery会丢失每个循环变量的数据,javascript,jquery,Javascript,Jquery,jQuery中的变量作用域有点小问题,如果我在.loop之外执行console.log,为什么会在$stockData上得到一个空数组?(如果我在.each中执行此操作,它工作正常,每次添加值时都会记录数组) 当你打电话的时候 $.getJSON(“/get_portfolio.php”,函数(dbData){…}) 本部分: 函数(dbData){…} 不会马上跑的。JavaScript说:“哦,你做了一个http请求?我会保留你给我的这个函数,并在请求完成后运行它。”。剩下的代码将继续运行,

jQuery中的变量作用域有点小问题,如果我在.loop之外执行console.log,为什么会在$stockData上得到一个空数组?(如果我在.each中执行此操作,它工作正常,每次添加值时都会记录数组)

当你打电话的时候

$.getJSON(“/get_portfolio.php”,函数(dbData){…})

本部分:

函数(dbData){…}

不会马上跑的。JavaScript说:“哦,你做了一个http请求?我会保留你给我的这个函数,并在请求完成后运行它。”。剩下的代码将继续运行,因此:

console.log($stockData)

我会先跑。所以这里的实际执行顺序是:

  • 您可以运行getJSON
  • console.log运行
  • HTTP请求完成并运行回调
  • 将console.log放在getJSON块中,就在
    之后。每个
    循环:

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

    您需要等待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
    }); 
    

    有趣的事实:jQuery每个循环都可以写成
    $。每个(dbData,函数(index,stock){
    它返回索引和索引处的值。默认情况下,我真希望jQuery将回调参数弃用为
    $。ajax
    而只做承诺…哦,这个问题一天要问100次。你不能引用异步回调中设置的变量。ajax 101这就像在线订购比萨饼。你不是你一按订单按钮就开始吃比萨饼。问题是比萨饼还没有送到,还在制作中。你需要等比萨饼送到后才能吃。还是给我空的array@MikeVervloet查看我的编辑-您还必须计算有多少内部请求已完成,并且仅限于此已经完成,你可以控制台了。logWorks现在很好,谢谢!
    $(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
    });