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