ng4中有很多獲取數據的API,為了滿足跨域的需求,我選擇JSONP模塊;
應該有很多小伙伴遇到這個報錯吧 injected script did not invoke callback;
下面我寫個完整的demo來解決這個問題。
一、在app.module.ts模塊中,注入JsonpModule模塊
import {JsonpModule} from "@angular/http"; @NgModule({ imports: [ JsonpModule //注入JSonpModule模塊 ] })
二、創建服務httpService,並注入jsonp和map
import { Injectable } from '@angular/core'; import {Jsonp} from "@angular/http"; //注入Jsonp模塊 import 'rxjs/add/operator/map'; //注入map @Injectable() export class HttpService { }
三、拼接請求url,編寫統一請求方法
這步最關鍵了,我們知道jsonp的請求地址是需要寫callback回調參數的,用作script標簽的id名;
就像下面的代碼,至於為啥callback="__ng_jsonp__.__req0.finished"這樣的形式;我也不是很明白。
let url1 = baseUrl + "&callback=" + "__ng_jsonp__.__req0.finished"; let url2 = baseUrl + "&callback=" + "__ng_jsonp__.__req1.finished";
很明顯,只要我們保證callback如上的結果,就可以正常的請求數據了,req0,req1……依次累加;
請求的核心代碼是jsonp的subscribe方法,回調函數中返回數據,代碼如下:
this.jsonp.get("請求地址").map(res => res.json()).subscribe(data => { // data為返回值 console.log(data); });
封裝的完整httpService代碼如下
static times = 0; 定義一個靜態屬性,用來記錄httpSerivice服務的請求次數,每次請求就+1,這樣保證每次請求的callback回調名都不一樣;
import { Injectable } from '@angular/core'; import {Jsonp} from "@angular/http"; import 'rxjs/add/operator/map'; @Injectable() export class HttpService { static times = 0; // 用於記錄jsonp請求的次數 private baseUrl: string = 'http://q.letwx.com/api/jsapi'; private sameKey: string = '&uid=' + Config.uid + '&wxapiopenid=' + Config.apiopenid + '&wxapitoken=' + Config.apitoken + '&debug=nf'; public ACTION: any = { // all action ACTLIST: 'schoolsign/teacher/actlist', // 查看簽到列表 ACTINFO: 'schoolsign/teacher/actinfo', // 查看簽到信息 STUADD: 'schoolsign/teacher/stuadd', // 添加學生 STULIST: 'schoolsign/teacher/stulist', // 查看學生列表 STUEDIT: 'schoolsign/teacher/stuedit', // 編輯學生姓名 STUDEL: 'schoolsign/teacher/studel', // 刪除學生 ACTADD: 'schoolsign/teacher/actadd', // 添加簽到活動 }; constructor( private jsonp: Jsonp ) {} getJSON(action: string, params: object, cb?: any): any { let callback = "&callback=" + "__ng_jsonp__.__req" + HttpService.times + ".finished"; HttpService.times ++; let url = this.baseUrl + '?action=' + action + '¶ms=' + JSON.stringify(params) + this.sameKey + callback; this.jsonp.get(url).map(res => res.json()).subscribe(data => { cb && cb(data); }); } }
四、在app.module.ts模塊中,注入服務httpService
@NgModule({
imports: [
JsonpModule
],
providers: [
HttpService
]
})
ok,有問題請留言吧!