0

可能重复:
将索引从 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);
            });
        };

问题是循环在 .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++;
            });
        };

有人知道我在做什么错吗?谢谢!

4

3 回答 3

0

以下其中一项应该可以满足您的需求:

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);
      });
};​
于 2012-11-01T15:37:19.947 回答
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() 调用时,它都会冻结,从而使您的整个页面冻结。

于 2012-11-01T15:46:32.703 回答
-1

你的问题是 getJson 异步执行,但是你需要同步执行。尝试使用 $.ajax 而不是 $.getJson。在 $.ajax 中,将属性 dataType 设置为 json 并将 async 设置为 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);
        });
    };
于 2012-11-01T15:18:56.570 回答