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 = ; // 用于记录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 + '&params=' + 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,有问题请留言吧!

angular4.0使用JSONP数据请求的更多相关文章

  1. 跨站数据请求哪家强——青出于蓝的jsonp

    /* * 跨站数据请求哪家强--青出于蓝的jsonp数据格式 * @author gj * @date 2017-09-15 */ 先哲有云"青,取之于蓝,而青于蓝:冰,水为之,而寒于水&q ...

  2. 使用jQuery-AJAX–读取获得跨域JSONP数据的示例

    在项目开发中,如果在同一个域名下就不存在跨域情况,使用$.getJSON()即可实现.但是需要跨域请求其他域名下面的Json数据就需要JSONP的方式去请求,跨域写法和getJSON有差异.如下:   ...

  3. Angular4.0学习笔记 从入门到实战打造在线竞拍网站学习笔记之二--路由

    Angular4.0基础知识见上一篇博客 路由 简介 接下来学习路由的相关知识 本来是不准备写下去的,因为当时看视频学的时候感觉自己掌握的不错 ( 这是一个灰常不好的想法 ) ,过了一段时间才发现An ...

  4. get,post,jsonp数据交互—百度下拉列表

    三种数据交互形式:get  post jsonp 一.get请求 1.引入 vue.js 和 vue-resource.js , 准备一个按钮 <input type="button& ...

  5. 前端笔记之服务器&Ajax(下)数据请求&解决跨域&三级联动&session&堆栈

    一.请求后端的JSON数据 JSON是前后端通信的交互格式,JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. JSON是互联网各个后台与 ...

  6. vue2-通过axios实现数据请求

    1.通过axios实现数据请求 vue.js默认没有提供ajax功能 所以使用vue的时候,一般都会使用axios的插件来实现ajax与后端服务器的数据交互. 注意,axios本质上就是javascr ...

  7. day 74 vue 2 axios数据请求 以及组件的学习

    前情提要:   vue 学习二: 一: 通过axios实现数据请求 1:json数据语法 json数据对象类似于JavaScript中的对象,但是它的键对应的值里面是没有函数方法的,值可以是普通变量, ...

  8. sencha touch结合webservice读取jsonp数据详解

    sencha touch读取jsonp数据主要依靠Ext.data.JsonP组件,在mvc的store文件中定义代码如下: Ext.define('eparkapp.store.ParksNearb ...

  9. Angular4.0从入门到实战打造在线竞拍网站学习笔记之二--路由

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 Angular4.0数据绑定&管道 路由 简介 接下来学习路由的相关知识 本来是不准备写下 ...

随机推荐

  1. vue-cli 安装失败Failed to download repo vuejs-templates/webapck-simple: Response code 404 (Not Found)

    新学习vue的萌新们经常会遇到各种各样的坑.例如上面这个报错.这个一般是命令行面板写错单词导致. 正确:vue init webpack-simple .(注意"."点,指当前目录 ...

  2. Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据

    基于之前的项目代码来编写 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页index页文章页面 现在我们修改一个文章列表是从数据库中获取数据, 下面我们就需 ...

  3. leetcode:程序猿面试技巧

    起因 写在开头,脑袋铁定秀逗了,历时20多天,刷完了leetcode上面151道题目(当然非常多是google的),感觉自己对算法和数据结构算是入门了,但仍然还有非常多不清楚的地方,于是有了对于每道题 ...

  4. hdu 4109 dfs+剪枝优化

    求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...

  5. HDU 4162 Shape Number(字符串,最小表示法)

    HDU 4162 题意: 给一个数字串(length <= 300,000),数字由0~7构成,求出一阶差分码,然后输出与该差分码循环同构的最小字典序差分码. 思路: 第一步是将差分码求出:s[ ...

  6. SQL运行时间

    打开SQL运行时间统计  set timing on; 查询是否有运行时间较长的SQL存在  select a.sid, b.sql_text   from v$session a, v$sqlare ...

  7. xml文档读取-SAX

    由于dom采用的是将xml文档加载入内存进行处理的方式,如果xml文档较大,则会导致加载时间过长,效率降低的情况,因此,sun公司在JAXP中又添加了对SAX的支持: SAX,全称Simple API ...

  8. 王磊:AI 时代物流行业的 OCR 应用

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ OCR 是人工智能里面非常重要的基础能力之一.腾讯云人工智能产品总监王磊,结合物流场景解读了OCR技术."OCR文本识别能够优化 ...

  9. Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分

    问题引入:   有一个下载功能,在Android 5.x设备上运行正常,Android 6.x上运行异常,现象是下载进度卡在0%.   问题排查发现,是sdk的target设置为23导致,修改为21则 ...

  10. 四.RabbitMQ之发布/订阅(Publish/Subscribe)

    一.基础知识点 在上述章节中,我们理解的RabbitMQ是基于如下这种模式运作的. 而事实上,这只是我们简单化了的模型的结果,真正的模型应该是这样的. P:Producer 生产者,生产消息,把它放进 ...