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



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

最新更新