jQuery每个循环变量数据丢失
jQuery each loop variable data lost
在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
当您调用时
$.getJSON( "/get_portfolio.php", function(dbData) { ... });
这部分:
function(dbData) { ... }
不会马上逃跑。JavaScript说:"哦,你做了一个http请求?我会保留你给我的这个函数,并在请求完成后运行它。"。您的代码的其余部分将继续运行,因此:
console.log($stockData);
将首先运行。所以这里的实际执行顺序是:
- 运行getJSON
- console.log运行
- HTTP请求完成,回调运行
将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
您需要等待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
});
相关文章:
- 当JSON数据=变量时,需要执行循环
- 如何将数据/变量从file_controller.rb传递到application.js
- 当移动到“外部”版本时,“内部”成功 AJAX 中的“数据”变量应该更改为什么
- 从 ajax jQuery 中的数据变量中获取属性
- 将脚本属性(数据变量)传递到 head.js
- 2 个数据变量的 mrender 不起作用
- 如何在 ng-repeat 过滤器中传递 HoDjango views.py 上下文数据变量
- 以简单的方式将多个数据变量传递给 AJAX 函数
- 如何从每个带有类的元素中获取数据变量
- 根据数据变量的d3网络图的颜色链接
- 如何在不同的网站之间共享数据变量或本地存储?iframe?postMessage
- 将数据变量从PHP传递到jquery ui对话框
- 数据变量没有从Vue.js中的监视器上的计算属性更新
- 弹出窗口数据变量传递
- 如何使用jquery发布输入数据变量
- vue .js:如何在.vue模板文件中的vue方法中设置数据变量
- JSON jQuery数据变量
- 从onclick()提取数据变量
- 忽略下划线模板中未定义的数据/变量
- 如何使用php数据变量创建条形图