$ .each Scope中的Javascript AJAX范围

所以我试图循环一些元素并根据ajax调用的结果更改一些文本。 问题是我无法从ajax回调中获取数据,我不确定如何将事件链接到这样做。 我得到一个股票报价值,如果我可以将该对象返回到前一个范围,匹配循环,然后在那里进行所有操作,那将是很好的。

$(function(){ var tweets = $('.tweet'); var symbol_pat = /(^|\s\$)([az]+\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 = ''+arguments[0]+''; }else{ html_str = ''+arguments[0]+''; } tweet_html = arguments[0].replace(html_str); $(this).html(tweet_html); } }); }); }); }); 

$.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\$)([az]+\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 = ''+arguments[0]+''; }else{ html_str = ''+arguments[0]+''; } 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); } }); }); }); }); 

只要您的replace代码是正确的,我相信您的代码的以下返工应该起作用(或者至少让您接近,因为这是未经测试的,取决于您的其余代码):

 $(function(){ var YAHOO_API_URL = 'http://query.yahooapis.com/v1/public/yql' var tweets = $('.tweet'); var symbol_pat = /(^|\s\$)([az]+\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 = ''+arguments[0]+''; } else{ html_str = ''+arguments[0]+''; } 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); } } }); }; });