可能重复:
passing index from for loop to ajax callback function (javascript)
我想延迟i ++直到jquery回调完成。我有这个:
for (var i = 0; i < stocks.length; i++) {
var lastprice = 0
var stock = stocks[i].stock;
$.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20("' + stock + '")&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys',
function(data) {
lastprice = data.query.results.quote.LastTradePriceOnly;
}).done(function() {
console.log(stock, lastprice);
});
};
问题是循环在.getJSON之前完成,所以我最终控制台记录了我的数组中的最后一个股票,但是我的数组中所有股票的价格。我试过这个,但它只是杀了我的浏览器:
for (var i = 0; i < stocks.length;) {
var lastprice = 0
var stock = stocks[i].stock;
$.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20("' + stock + '")&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys',
function(data) {
lastprice = data.query.results.quote.LastTradePriceOnly;
}).done(function() {
console.log(stock, lastprice);
i++;
});
};
任何人都知道我做错了什么?谢谢!
答案 0 :(得分:0)
以下其中一项应该可以满足您的需求:
var stocks = [
{"stock":"aapl"},
{"stock":"yhoo"}
]
for (var i = 0; i < stocks.length;i++) {
var stock = stocks[i].stock;
$.ajax({
url: 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20("' + stock + '")&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys',
dataType: 'json',
async: false,
success: function(data) {
console.log(stock, data.query.results.quote.LastTradePriceOnly);
}
});
};
var stocks = [
{"stock":"aapl"},
{"stock":"yhoo"}
]
for (var i = 0; i < stocks.length;i++) {
var stock = stocks[i].stock;
$.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20("' + stock + '")&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys',
function(data) {
console.log(data.query.results.quote.Symbol, data.query.results.quote.LastTradePriceOnly);
});
};
答案 1 :(得分:0)
你的for loop
如果杀了你的浏览器是因为你不小心使用了一个名为忙等待(坏)的东西。 http://en.wikipedia.org/wiki/Busy_waiting
我不知道您的问题的上下文,但除非在初始加载页面期间发生这种情况,否则应避免同步执行。相反,构建代码以便它是事件驱动的。
例如,如果for loop
用于在表中生成行,那么该行的实际呈现是在ajax调用的成功回调函数内发生的。
示例:
for (var i = 0; i < stocks.length; i++) {
var lastprice = 0
var stock = stocks[i].stock;
$.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20("' + stock + '")&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys', function(data) {
lastprice = data.query.results.quote.LastTradePriceOnly;
//RENDER ROW
$('<span class="row"/>').html(lastprice).appendTo('#TABLE_BODY_ELEMENT');
})
};
如果你使用同步而不是异步,每次循环点击.getJSON()调用时它都会冻结,使整个页面冻结。
答案 2 :(得分:-1)
你的问题是getJson异步执行,但是你需要同步执行。 尝试使用$ .ajax而不是$ .getJson。 在$ .ajax中,将属性dataType设置为json,将async设置为false。
OR基于评论尝试设置 $。ajaxSetup({async:false});
for (var i = 0; i < stocks.length; i++) {
var lastprice = 0
var stock = stocks[i].stock;
$.ajaxSetup({ async:false});
$.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20("' + stock + '")&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys',
function(data) {
lastprice = data.query.results.quote.LastTradePriceOnly;
}).done(function() {
console.log(stock, lastprice);
});
};