2012-05-18 3 views
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); 
        } 
       }); 

      }); 
      }); 

     }); 

ответ

0

$.ajax() работает асинхронно, так что вы можете на самом деле не «ждать» для успеха в предыдущей области. Вы можете использовать jQuery обещание и отсрочку для этого. Проверьте http://www.erichynds.com/jquery/using-deferreds-in-jquery/ и http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/

EDIT: показывает альтернативное решение, которое не требует обещания или отложено:

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

    }); 
    }); 

}); 
+0

Все еще не уверен если я могу сделать что-то вроде quote = $ .get (request) .success (return data.results.quote;); с отложенным я могу просто установить async на false, так что он должен ждать окончания, мне просто нужно установить переменную во внешнюю область. – BillPull

+0

async to false - очень плохая идея, так как браузер замерзнет на время. Вместо этого скажите 'var req = $ .get (request); req.success (function() {'... – robrich

+0

ok. Хорошие примеры того, как вернуть переменную из ajax-вызова. – BillPull

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

Я думаю, что у вас есть дополнительный кронштейн. – BillPull

+0

nope ... все скобки правильно спарены (один прячется вправо на строке, которая начинается 'if (successCallback! == undefined ...') – jimmym715

+1

Это очень опасно. 'getQuote' не возвращает строку, это всегда возвращает 'undefined' - потому что в нем нет оператора возврата. – robrich