可能的重复:
将索引从for循环到AJAX回调函数(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);
});
};
问题是循环完成。我尝试了一下,但它只是杀死了我的浏览器:
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++;
});
};
有人知道我在做什么错吗?谢谢!
以下一个应执行您要寻找的事情:
http://jsfiddle.net/bxkkp/
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);
}
});
};
或:http://jsfiddle.net/9nrxy/
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);
});
};
如果杀死浏览器,您的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()调用它会冻结它,使整个页面冻结。
您有问题的是,Getjson在异步执行时,但是您需要同步执行。尝试使用$ .ajax代替$ .getjson。在$ .ajax中,将属性数据类型设置为json和async to false。
或基于评论尝试设置 $。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);
});
};