我正在编写一个函数来调用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]
知道为什么会这样吗?我该如何解决?
非常感谢。
答案 0 :(得分:0)
回调函数需要在每个JSONP请求上以不同方式命名,即。每个回调只能使用一次。否则,将无法知道哪个http.json调用导致调用回调函数。
Angular可能将下一个回调命名为__ng_jsonp__.__req1
,因此您应该让Angular处理回调命名。
如果您的服务器在名为jsonp
的参数中查找回调名称,那么您应该只需将参数中的jsonp值更改为jsonp: 'JSONP_CALLBACK'
即可解决此问题。 Angular将使用正确的回调名称替换JSONP_CALLBACK
。默认情况下,它还会使用该值设置名为callback
的参数。