0

Possible Duplicate:
passing index from for loop to ajax callback function (javascript)

I'd like to delay the i++ until the jquery callback is done. i have this:

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

and the problem is the loop finishes before the .getJSON does, and so I just end up console logging the last stock in my array, but the prices of all the stocks in my array. I tried this but it just kills my browser:

        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++;
            });
        };

Anyone know what I'm doing wrong? Thanks!

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が非同期で実行されることですが、同期実行が必要です。$.getJsonの代わりに$.ajaxを使用してみてください。$ .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 に答える