angularjs - 返回 JSONP 时不执行 HTTPpromise

Posted

技术标签:

【中文标题】angularjs - 返回 JSONP 时不执行 HTTPpromise【英文标题】:angularjs - HTTPpromise does not execute when JSONP is returned 【发布时间】:2013-05-21 00:43:32 【问题描述】:

我正在尝试从 yahoo 的 api 获取股票报价,并且我正在使用 angular 的 $http.jsonp 方法。目标是当结果返回时,让应用程序转到此路线:'/stocks/show_stock'。我试图以两种方式做到这一点,但都不起作用 1)我把声明:

window.location = '/stocks/show_stock'

在包装 JSONP 响应的回调函数中 2)我把声明:

$location.path '/stocks/show_stock'

在 HTTPpromise 回调中。 (见代码中的cmets)

这是我的代码(在 coffescript 中):

#THIS IS THE CALLBACK FUNCTION THAT I SEND WITH THE JSONP REQUEST  
window.stock_quote_callback = (data)->
  console.log data #THIS WORKS AND I CAN SEE THE DATA RETURNED FROM YAHOO
  window.stock_quote_result = data.results
  alert 'I am in the callback'
  #THE STATEMENT BELOW DOES NOT WORK EVEN THOUGH I CAN SEE THE ALERT ABOVE
  window.location = '/stocks/show_stock'

angular.module('Services').service 'StockSupplier', ($http)->
  get_stock = (symbol)->
    q = 'select * from yahoo.finance.quotes 
        where symbol in ("'+symbol+'")
        &format=json&
        diagnostics=true&
        env=http://datatables.org/alltables.env&
        callback=stock_quote_callback'
    url = 'http://query.yahooapis.com/v1/public/yql?q='+q 
    $http.jsonp(url).then (data)->
      #THE CODE BELOW NEVER EXECUTES EVEN THOUGH RESULT IS RETURNED
      alert 'This should pop up when result returns'
      $location.path'/stocks/show_stock'

  
    get_stock: (symbol)-> get_stock(symbol)
  

提前谢谢你。

【问题讨论】:

你没有在url中添加callback=JSON_CALLBACK,url应该是query.yahooapis.com/v1/public/… 它就在那里。 'q' 字符串的第 6 行。正如我所提到的,这不是问题,我确实让回调触发,但该回调中的 window.location = '/stocks/show_stock' 不起作用。这就是为什么我尝试使用 httpPromise 的 'then' 功能但也没有用 谢谢 Ajay,我知道你的意思了。 【参考方案1】:

我不写coffeescript,所以我把它翻译成javascript。你忘了注入 $location 服务,除此之外我只是将 callback=stock_quote_callback 替换为 callback=JSON_CALLBACK 并创建了一个运行良好的 plunker:http://run.plnkr.co/hCAdohIJIr9Odn3m/(来源:http://plnkr.co/edit/a7C6k0QVoXnaTyImSUkb?p=preview)。

angular.module('Services').service('StockSupplier', function($http,$location) 
  var get_stock;
  get_stock = function(symbol) 
    var q, url;
    q = 'select * from yahoo.finance.quotes where symbol in ("' + symbol + '")&'+
        'format=json&'+
        'diagnostics=true&'+
        'env=http://datatables.org/alltables.env&'+
        'callback=JSON_CALLBACK ';
    url = 'http://query.yahooapis.com/v1/public/yql?q=' + q;
    return $http.jsonp(url).then(function(data) 
      alert('This should pop up when result returns');
      $location.path( '/stocks/show_stock' );
    );
  ;
  return 
    get_stock: function(symbol) 
      return get_stock(symbol);
    
  ;
);

【讨论】:

非常感谢乔!阅读角度文档时,我认为“JSON_CALLBACK”是您希望在响应返回时执行的函数名称的占位符,而不是我必须将“JSON_CALLBACK”作为函数的名称。这样就解决了。

以上是关于angularjs - 返回 JSONP 时不执行 HTTPpromise的主要内容,如果未能解决你的问题,请参考以下文章

使用 AngularJS 从 NodeJS 服务器返回 JSONP

JsonP 返回“未捕获的语法错误:意外的令牌:”AngularJS - routingnumbers.info

在 AngularJS 中解析 JSONP 文件

在 AngularJS 中设置 JSONP 回调函数

angularjs中jsonp请求的异常处理

如何从 angularjs 中的 JSONP 错误回调中获取数据?