2010-06-24 57 views
4

我想从外部源获取实时汇率,所以我发现这个伟大的Web服务:的jQuery + JSONP +雅虎查询语言

Currency Convertor

该服务工作就像一个魅力,唯一不足的是它不提供JSONP结果,只提供XML。因此,在尝试使用jQuery $ .ajax()来使用此webservice时,我们遇到了跨浏览器问题。

所以我发现Yahoo Query Language它返回结果作为JSONP和mangae消耗其他web服务并返回结果。这也是工作,这里有一个例子网址:

http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fwww.webservicex.net%2FCurrencyConvertor.asmx%2FConversionRate%3FFromCurrency%3DNOK%26ToCurrency%3DEUR'&format=json&diagnostics=true&callback=cbfunc 

此URL返回JSONP结果和工作就像一个魅力,但是当我用这个在我的代码出现的问题:

 $.ajax({ 
      type: "GET", 
      url: urlToWebservice, 
      contentType: "application/json; charset=utf-8", 
      dataType: "jsonp", 
      success: function(data) { 
       $("#status").html("OK: " + data.text); 
      }, 
      error: function(xhr, textStatus, errorThrown) { 
       $("#status").html("Unavailable: " + textStatus); 
      } 
     }); 

当我尝试运行这段代码什么也没有发生,我可以看到在我的萤火虫此错误消息JavaScript调试器:

cbfunc is not defined 

cbfunc是围绕JSON反应容器的名字,但为什么它SA没有定义?

编辑:

这是我的新代码,但我仍然得到cbfunc is not defined

 $.ajax({ 
      url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fwww.webservicex.net%2FCurrencyConvertor.asmx%2FConversionRate%3FFromCurrency%3DNOK%26ToCurrency%3DEUR'&format=json&callback=cbfunc", 
      dataType: 'jsonp', 
      jsonp: 'callback', 
      jsonpCallback: 'cbfunc' 
     }); 
     function cbfunc(data) { 
      alert("OK"); 
     } 

与 “OK” 的消息从来没有发射...

+1

卫生署..愚蠢的我来说,'函数cbfunc(数据)'是另一个函数里面,当我把它外面这个功能作为一个单独的功能,它接缝工作! – Martin 2010-06-24 22:23:43

+1

为什么显式指定回调为'cbfunc',并且当你可以让jQuery处理事情并且在你的'success'回调中正常进行,就像你对非JSONP调用做的那样,它很难依赖这个函数的存在吗? – Anurag 2010-06-24 22:31:51

回答

5

如果可以,请在呼叫的jsonpCallback参数$.ajax,如:

jsonpCallback: "cbfunc", 

其描述,从jQuery API docs写着:

为JSONP请求指定回调函数的名称。这个值将被用来代替jQuery自动生成的随机名称。

该文档后继续说:

最好是让jQuery的生成一个唯一的名称,它会更容易管理的要求和提供的回调和错误处理。当您希望启用更好的浏览器缓存GET请求时,您可能需要指定回调。

然而,它是建议利用YQL的时候使用这个“最好”的行为。正是为什么这种方法不理想可能会使这个答案太冗长,所以这里有一个链接(来自YQL博客),详细说明了jQuery首选方法的问题,利用了jsonpCallback等等:Avoiding rate limits and getting banned in YQL and Pipes: Caching is your friend

+0

感谢您的回复,这是一个很棒的博客链接。我读了他们写的并尝试了他们的jQuery示例,但仍然得到'cbfunc is not defined'消息。我编辑了我的帖子以包含我的新代码。 – Martin 2010-06-24 22:15:32

2

你应该让jQuery通过将urlToWebservice更改为callback=?

2

它的原因没有工作是因为在查询字符串指定callback=cbfunc产生的那种类型的URL:

http://query.yahooapis.com/...&callback=cbfunc&callback=jsonp1277417828303 

去掉了所有感兴趣的部分,但URL包含两个callback参数。其中一个由jQuery管理,另一个不是。 YQL仅查看第一个callback参数并返回一个包含该参数的响应。

cbfunc({"query":{...}}); 

然而,没有命名脚本cbfunc功能,所以这就是为什么你所得到的未定义错误。 jQuery的创建在上面的例子中名为jsonp1277417828303隐函数,并从YQL的反应应该不是一直:

jsonp1277417828303({"query":{...}}); 

为jQuery来对其进行处理,并且响应返回到您success回调,它从来没有做。

因此,如@SLaks建议,从您的URL中删除&callback=cbfunc,或将其替换为&callback=?以让jQuery处理事情。

查看working example