" TypeError:__ ng_jsonp __.__ req0为null"在第二次jsonp电话

时间:2018-03-27 09:00:52

标签: angular ionic-framework callback jsonp

我正在编写一个函数来调用Forismatic的API来生成随机引用:

getQuote() {

    var quote: any = { quote:"", person: "", link: "" };

    var url = "http://api.forismatic.com/api/1.0/";
    var headers = new Headers();
    headers.append("Accept", 'application/json');
    headers.append('Content-Type', 'application/json' );

    let params = {
      method: "getQuote",
      format: "jsonp",
      lang: "en",
      jsonp: "__ng_jsonp__.__req0.finished" 
    }

    let options = new RequestOptions({ 
      headers: headers,
      method: 'Get',
      params: params
    });

    this.jsonp.get(url, options)
      .map( res => res.json() ) 
      .subscribe(q => {
        console.log(q)
        quote.quote = q.quoteText
        quote.person = q.quoteAuthor;
        quote.link = q.quoteLink;
       }, 
       error => {
        console.log(error);// Error getting the data
      }
    );
    return quote;
  }

该功能在加载应用程序时有效。 console.log(q)打印如下所示的对象,这是预期的结果:

Object { quoteText: "Criticism is something you can easily avoid by saying nothing, doing nothing, and being nothing.", quoteAuthor: "Aristotle", senderName: "", senderLink: "", quoteLink: "http://forismatic.com/en/9399c6b9a3/" }

但是,如果我第二次调用该函数(例如通过复制函数调用的第二行或使用按钮调用它),我会收到以下错误:

Object { _body: "JSONP injected script did not invoke callback.", status: 200, ok: true, statusText: "Ok", headers: {…}, type: 3, url: "http://api.forismatic.com/api/1.0/?method=getQuote&format=jsonp&lang=en&jsonp=__ng_jsonp__.__req0.finished" }

random-quote.ts:49:8
TypeError: __ng_jsonp__.__req0 is null[Learn More]

知道为什么会这样吗?我该如何解决?

非常感谢。

1 个答案:

答案 0 :(得分:0)

回调函数需要在每个JSONP请求上以不同方式命名,即。每个回调只能使用一次。否则,将无法知道哪个http.json调用导致调用回调函数。

Angular可能将下一个回调命名为__ng_jsonp__.__req1,因此您应该让Angular处理回调命名。

如果您的服务器在名为jsonp的参数中查找回调名称,那么您应该只需将参数中的jsonp值更改为jsonp: 'JSONP_CALLBACK'即可解决此问题。 Angular将使用正确的回调名称替换JSONP_CALLBACK。默认情况下,它还会使用该值设置名为callback的参数。