0

そのため、いくつかの要素をループして、ajax 呼び出しの結果に基づいてテキストを変更しようとしています。問題は、ajax コールバックからデータを取得できず、イベントを連鎖させる方法が正確にわからないことです。株価の値を取得しています。そのオブジェクトを前のスコープ、一致のループに戻し、そこですべての操作を行うことができればいいのですが。

$(function(){
          var tweets = $('.tweet');
          var symbol_pat = /(^|\s\$)([a-z]+\b)/gi;
          $.each(tweets, function(){
            var tweet_html = $(this).html();
            tweet_html = tweet_html.replace(symbol_pat,function(){
               var symbol = arguments[2];
               var YAHOO_API_URL = 'http://query.yahooapis.com/v1/public/yql'
               var format = 'json'
               var query = 'select * from yahoo.finance.quotes where symbol in ("'+symbol+'")';
               var env = "store://datatables.org/alltableswithkeys";

               $.ajax({
                    'url':YAHOO_API_URL,
                    'async':false,
                    'method':'GET',
                    'data': {
                        'format':format,
                        'q':query,
                        'env':env
                    },
                    success: function(data){
                        var quote = data.query.results.quote;
                        var change = quote.Change;
                        var change_pct = quote.ChangeinPercent;
                        var quote_price = quote.LastTradePriceOnly;
                        var html_str = "";

                        if( change.indexOf("+") != -1 ){
                            html_str = '<span class="symWrap up">'+arguments[0]+'</span>';
                        }else{
                            html_str = '<span class="symWrap down">'+arguments[0]+'</span>';
                        }

                        tweet_html = arguments[0].replace(html_str);
                        $(this).html(tweet_html);
                    }
               });

            });
          });

        });
4

2 に答える 2

0

$.ajax()非同期で実行されるため、前のスコープでの成功を実際に「待つ」ことはできません。ただし、jQuery promise と Deferred を使用してこれを行うことができます。http://www.erichynds.com/jquery/using-deferreds-in-jquery/およびhttp://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/を確認してください。

編集: 約束または遅延を必要としない代替ソリューションを表示:

$(function(){
  var tweets = $('.tweet');
  var symbol_pat = /(^|\s\$)([a-z]+\b)/gi;
  $.each(tweets, function(){
       var that = this;

       var symbol = arguments[2];
       var YAHOO_API_URL = 'http://query.yahooapis.com/v1/public/yql'
       var format = 'json'
       var query = 'select * from yahoo.finance.quotes where symbol in ("'+symbol+'")';
       var env = "store://datatables.org/alltableswithkeys";

       $.ajax({
        'url':YAHOO_API_URL,
        'async':false,
        'method':'GET',
        'data': {
        'format':format,
        'q':query,
        'env':env
        },
        success: function(data){
        var quote = data.query.results.quote;
        var change = quote.Change;
        var change_pct = quote.ChangeinPercent;
        var quote_price = quote.LastTradePriceOnly;
        var html_str = "";

        if( change.indexOf("+") != -1 ){
            html_str = '<span class="symWrap up">'+arguments[0]+'</span>';
        }else{
            html_str = '<span class="symWrap down">'+arguments[0]+'</span>';
        }

            var tweet_html = $(that).html();
                var tweet_html = arguments[0].replace(html_str);
            tweet_html = tweet_html.replace(symbol_pat,html_str);
        $(that).html(tweet_html);
        }
       });

    });
  });

});
于 2012-05-18T01:54:14.480 に答える
-1

あなたのコードが正しい限りreplace、私はあなたのコードの次のリワークがうまくいくと信じています(または、これはテストされておらず、コードの残りの部分に依存しているため、少なくともあなたを近づけます):

$(function(){

    var YAHOO_API_URL = 'http://query.yahooapis.com/v1/public/yql'

    var tweets = $('.tweet');
    var symbol_pat = /(^|\s\$)([a-z]+\b)/gi;
    $.each(tweets, function(){
        var tweet_html = $(this).html();
        tweet_html = tweet_html.replace(symbol_pat, function(){
            var symbol = arguments[2];
            var format = 'json'
            var query = 'select * from yahoo.finance.quotes where symbol in ("'+symbol+'")';
            var env = "store://datatables.org/alltableswithkeys";
            var quoteHtml = getQuote(format, query, env, function(quote) {
                var change = quote.Change;
                var change_pct = quote.ChangeinPercent;
                var quote_price = quote.LastTradePriceOnly;
                var html_str = "";

                if( change.indexOf("+") != -1 ){
                    html_str = '<span class="symWrap up">'+arguments[0]+'</span>';
                }
                else{
                    html_str = '<span class="symWrap down">'+arguments[0]+'</span>';
                }
                return arguments[0].replace(html_str);
            });
            return quoteHtml;
        });
        $(this).html(tweet_html);
    });

    var getQuote = function(format, query, env, successCallback) {
       $.ajax({
            'url':YAHOO_API_URL,
            'async':false,
            'method':'GET',
            'data': {
                'format': format,
                'q': query,
                'env': env
            },
            success: function(data){
                var quote = data.query.results.quote;
                if(successCallback !== undefined && typeof successCallback == 'function') {
                    successCallback(quote);
                }
            }
       });
    };
});
于 2012-05-18T02:18:26.667 に答える