angular2系列教程(七)Injectable、Promise、Interface、使用服务
今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我们一睹为快!
例子
例子是官方的例子,加载一个英雄列表,点击显示详细信息。我直接放在我们的升级后的装备里面。
Injectable
在ng2里面如何编写服务呢?非常简单,你只需要写个类即可。那么这个@Injectable()是做什么的?其实单就这个例子来说,我们是不需要写个这个装饰的,因为我们的HeroSerivce没有依赖,如果你要写一个有依赖的服务,那么你需要加上这个@Injectable(),此处加上@Injectable()是可有可无的,但是写上是个好习惯。
app/hero.service.ts(部分代码)
@Injectable()
export class HeroService {
getHeroes() {
return Promise.resolve(HEROES);
}
// See the "Take it slow" appendix
getHeroesSlowly() {
return new Promise<Hero[]>(resolve =>
setTimeout(() => resolve(HEROES), 2000) // 2 seconds
);
}
}
以上代码我们干了哪些事儿呢?
- 写了一个使用injectable装饰的类
- 写了两个成员函数
- 一个返回一个Promise,直接resolve数据
- 另一个也返回一个Promise,不过在两秒后resolve数据
有的同学会问:resolve的数据哪去了?Promise是什么?我们继续讲解。
Promise
如果你玩过ng1,你一定对promise不陌生,因为我们经常在路由里面写resolve,这里就可以接受一个Promise对象。还有ng1中的$q.defer()等等。
但是promise并不是ng1的专利,你可以在你的任何javascript程序中使用promise,因为在ES6中已经原生提供Promise对象。你可以查看它的用法,这里我简单描述下:
- 构造Promise,只需要在里面加入一个参数,这个参数是个function,这个function可以接受两个参数:resolve, reject。或者使用Promise.resolve(),不过这样没有延迟了。
- 使用Promise对象,最常用的方法是then(),里面接受一个function,这个function的参数为resolve的值。除了then()还有catch()等
为了让大家能够清晰的了解Promise的用法,我们打开chrome的console:
- 输入Promise,是个function。
- 输入Promise.resolve('123'),我们得到一个状态为“已经解决”的promise。
- 输入new Promise(resolve=>resolve('123')),我们还是得到一个状态为“已经解决”的promise。
2和3的区别在于,后者可以在参数的函数中做一些处理,比如延迟或者http请求。
然后让我们来看Promise的then方法:
- 首先我们写了一个已经resolved的promise,并将其赋值给p
- 然后使用p.then(),在回调函数里面打印参数,得到‘123’
- 最后p.then()整体返回的是个初始化(pending)的promise。
现在我们明白一下这个代码中promise的用法了吧?
app/hero.service.ts(部分代码)
@Injectable()
export class HeroService {
getHeroes() {
return Promise.resolve(HEROES);
}
// See the "Take it slow" appendix
getHeroesSlowly() {
return new Promise<Hero[]>(resolve =>
setTimeout(() => resolve(HEROES), 2000) // 2 seconds
);
}
}
那么我们为何要使用promise呢?主要是为了解决回调地狱的问题。因为有了promise,你不必再写深层的回调,而是像极了同步的写法。
这是我的一个ng1的项目的部分代码,用promise的then()来解决回调地狱。
Auth.$createUser({email: email, password: pass})
.then(function() {
// authenticate so we have permission to write to Firebase
return Auth.$authWithPassword({ email: email, password: pass });
})
.then(function(user) {
// create a user profile in our data store
var ref = wdutil.ref('users', user.uid);
return wdutil.handler(function(cb) {
ref.set({email: email, name: $scope.name||firstPartOfEmail(email)}, cb);
});
})
.then(function(/* user */) {
$scope.wait.show=false;
// redirect to the account page
$location.path('/account');
}, function(err) {
$scope.wait.show=false;
$scope.alerts.push({type:'danger',msg:wdutil.errMessage(err)});
});
Interface
在编写这个服务的过程中我们使用了interface这个概念,这个知识点属于ts的范畴,我们通常在接口中声明类型,有点像react中的propTypes:
app/hero.ts
export interface Hero {
id: number;
name: string;
}
然后我们在我们的服务中使用了这个接口:
app/hero.service.ts(部分代码)
import {Hero} from './hero';
app/hero.service.ts(部分代码)
return new Promise<Hero[]>(resolve =>
setTimeout(() => resolve(HEROES), 2000) // 2 seconds
);
除此之外,我们在我们的组件里面也多次使用了这个接口:
app/app.component.ts
heroes: Hero[]; selectedHero: Hero;
app/hero-detail.component.ts
export class HeroDetailComponent {
hero: Hero;
}
到此为止,我们的服务就算是写好了!
使用服务
让我们在组件中测试一下我们写好的服务吧:
app/app.component.ts(部分代码)
import {HeroService} from './hero.service';
app/app.component.ts(部分代码)
providers: [HeroService]
app/app.component.ts(部分代码)
constructor(private _heroService: HeroService) { }
getHeroes() {
this._heroService.getHeroes().then(heroes => this.heroes = heroes);
}
以上代码我们干了这些事儿:
- 利用模块系统导入这个服务类
- 在组件中注入这个服务
- 在构造函数中将这个服务赋给一个私有变量_heroService
- 然后就可以尽情地在类中使用这个服务对象了this._heroService
这里的getHeroes()返回了一个Promise,所以我们可以使用then来处理接下来要发生的事。
教程源代码及目录
如果您觉得本博客教程帮到了您,就赏颗星吧!
https://github.com/lewis617/angular2-tutorial
angular2系列教程(七)Injectable、Promise、Interface、使用服务的更多相关文章
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- ASP.NET 5系列教程(七)完结篇-解读代码
在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- angular2系列教程(一)hello world
今天我们要讲的是angular2系列教程的第一篇,主要是学习angular2的运行,以及感受angular2的components以及模板语法. 例子 这个例子非常简单,是个双向数据绑定.我使用了官网 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 使用企业库异常处理应用程序模块的 ...
- webpack4 系列教程(七): SCSS提取和懒加载
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)webpack4 系列教程(七): SCSS 提取和懒加载. 个人技术小站: https://god ...
- (转)NGUI系列教程七(序列帧动画UITexture 和 UIsprit)
NGUI系列教程七(序列帧动画) 今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还 ...
- 【转】PyQt5系列教程(七)控件
PyQt5系列教程(七)控件 软硬件环境 Windows 10 Python 3.4.2 PyQt 5.5.1 PyCharm 5.0.4 前言 控件是PyQt应用程序的基石.PyQt5自带很多不 ...
- Unity3D脚本中文系列教程(七)
http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...
- NGUI系列教程七(序列帧动画)
今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还要在啰嗦一句,首先大家要准备一些序列帧 ...
随机推荐
- 关于DOM的操作以及性能优化问题-重绘重排
写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...
- C语言 · 阶乘计算 · 基础练习
问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A[0]表 ...
- Win10 IIS本地部署网站运行时图片和样式不正常?
后期会在博客首发更新:http://dnt.dkill.net 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 启用关闭win功 ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- 写出易调试的SQL
h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...
- 深入node之Transform
Transform流特性 在开发中直接接触Transform流的情况不是很多,往往是使用相对成熟的模块或者封装的API来完成流的处理,最为特殊的莫过于through2模块和gulp流操作.那么,Tra ...
- MongoDB系列(一):简介及安装
什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为应用提供可扩展的高 ...
- mac好用的markdown编辑器
在刚开始接触markdown的时候,就被吸引了.此后一直在找贴心的好用的markdown编辑器.印象笔记和马克飞象配合着用也是挺好的,唯一的缺点就是比较封闭,发个笔记的链接给同学,还得注册才能看,导致 ...
- 检查sql执行效率
SELECT SUBSTRING(ST.text, ( QS.statement_start_offset / 2 ) + 1, ( ( CASE statem ...
- Concurrency
<Concurrency>:http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html <Java ...