我可以把i放在jquery.done()回调中吗?

时间:2012-11-01 15:14:31

标签: javascript jquery json for-loop callback

  

可能重复:
  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++;
            });
        };

任何人都知道我做错了什么?谢谢!

3 个答案:

答案 0 :(得分: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);
      });
};​

答案 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);
        });
    };