angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp、URLSearchParams、observable中断选择数据流的用法。

例子

例子的第一个程序,上节课已经讲过了。这节课我们学习第二个程序,从wiki的api中跨域获取数据,可实现300毫秒内中断和选择最近请求等炫酷功能,这些功能都来自于observable!

运行方法:

在http目录或者上级目录起个服务即可:

http-server

没有则需要安装http-server:

sudo  npm install http-server -g

源代码:

https://github.com/lewis617/angular2-tutorial/tree/gh-pages/http

demo演示:

http://lewis617.github.io/angular2-tutorial/http/

Jsonp

在讲解observable的api前呢?我们还是把例子的代码给讲解完

app/wiki/wikipedia.service.ts

import {Injectable} from ‘angular2/core‘;
import {Jsonp, URLSearchParams} from ‘angular2/http‘;

@Injectable()
export class WikipediaService {
  constructor(private jsonp: Jsonp) {}

  search (term: string) {

    let wikiUrl = ‘http://en.wikipedia.org/w/api.php‘;

    var params = new URLSearchParams();
    params.set(‘search‘, term); // the user‘s search value
    params.set(‘action‘, ‘opensearch‘);
    params.set(‘format‘, ‘json‘);
    params.set(‘callback‘, ‘JSONP_CALLBACK‘);

    // TODO: Add error handling
    return this.jsonp
               .get(wikiUrl, { search: params })
               .map(request => <string[]> request.json()[1]);
  }
}

以上代码我们干了几件事:

  1. 导入需要的api
  2. 写一个使用Injectable装饰的类(服务)
  3. 在构造函数中注入Jsonp服务
  4. 编写search成员函数实现获取数据的功能

这个jsonp服务从何而来?来自import {JSONP_PROVIDERS} from ‘angular2/http‘;,我们将其注入在组件中:

app/wiki/wiki.component.ts和app/wiki/wiki-smart.component.ts

providers:[JSONP_PROVIDERS, WikipediaService]

这样组件中的服务就可以用了!

URLSearchParams

然后我们发现我们从

import {Jsonp, URLSearchParams} from ‘angular2/http‘;

http中引入了另一个api,URLSearchParams。

这是什么?用来干嘛?qs大家一定非常熟悉,就是url后面那个?和&。我们的程序也可以这样写:

let queryString =
  `?search=${term}&action=opensearch&format=json&callback=JSONP_CALLBACK`

return this.jsonp
           .get(wikiUrl + queryString)
           .map(request => <string[]> request.json()[1]);

URLSearchParams,可以将qs写成对象,通过调用对象的方法来获取设置其参数,然后给ng2用!像这样需要对象嵌套对象的时候,URLSearchParams就显得非常方便!

简单监听数据流

服务写好了,然后我们在组件中调用服务来请求数据吧!首先来个简单的,即每次输入都会发请求:

app/wiki/wiki.component.ts

items: Observable<string[]>;

  search (term: string) {
    this.items = this._wikipediaService.search(term);
  }

我们在组件的类中定义了一个items,类型是Observable。然后又写了一个成员函数search用于调用服务获取数据。非常简单,输入的数据在term变量中,被源源不断的输入到服务里面,服务通过调用api,源源不断的返回数据流给observable,我们拿到observable后将其传给items这个observable,然后在模板中渲染出来!

app/wiki/wiki.component.ts

<input #term (keyup)="search(term.value)"/>

    <ul>
      <li *ngFor="#item of items | async">{{item}}</li>
    </ul>

async这个过滤器之前已经讲过不再赘述!

中断数据流,选择数据流

让我们来实现更炫酷的功能吧!我们希望不要每个字符输入都请求服务器,我们希望300毫秒以内的字符输入都被中断掉!使用observable就对了,promise可没有这么炫酷的功能!

app/wiki/wiki-smart.component.ts

 private _searchTermStream = new Subject<string>();

  search(term:string) { this._searchTermStream.next(term); }

  items:Observable<string[]> = this._searchTermStream
    .debounceTime(300)
    .distinctUntilChanged()
    .switchMap((term:string) => this._wikipediaService.search(term));

我们在上一个简单的程序基础上增加了一个成员变量searchTermStream,是个Subject类型,这是什么鬼?这是官方文档。

简单来说,Subject就是用来创建流的,每次我们输入字符,都可以使用searchTermStream的next方法将字符源源不断的添加到searchTermStream中。

然而这个searchTermStream同时也是observable,我们可以使用debounceTime这个api将数据流的流动频率控制在300毫秒以上,这意味着300毫秒以内输入多次也只能发出一次。

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md

接着我们使用了distinctUntilChanged这个api用于中断没有改变的情况,比如一个用户先输入“angular”,然后不小心输入了“angularrrrr”,接着他立马按回格键,变成了“angular”,两次都是“angular”,没有发生改变,就会被distinctUntilChanged这个api给中断掉!promise可没有中断功能!非常炫酷!

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/distinctuntilchanged.md

好吧,还有更加炫酷的api。我们甚至可以选择最近的一次数据流。使用switchMap就可以做到,新版本被更换成了flatmaplatest,顾名思义就是选择最后的项,这里指的是最近的请求!

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/flatmaplatest.md

observable的api太多了,大家需要可以查询,不再一一讲述:

https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators


教程源代码及目录

如果您觉得本博客教程帮到了您,就赏颗星吧!

https://github.com/lewis617/angular2-tutorial

时间: 2024-10-28 14:41:47

angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流的相关文章

Unity3D脚本中文系列教程(九)

Unity3D脚本中文系列教程(八) name 对象名称hideFlags 该物体是否被隐藏,保存在场景中或被用户修改继承的函数 GetInstanceID 返回该物体的实例id继承的类函数 operator bool 这个物体存在吗?Instantiate 克隆original物体并返回这个克隆.Destroy 移除一个游戏物体.组件或资源.DestroyImmediate 立即销毁物体obj.强烈建议使用Destroy代理.FindObjectsOfType 返回所有类型为type的激活物体

angular2系列教程(一)hello world

今天我们要讲的是angular2系列教程的第一篇,主要是学习angular2的运行,以及感受conponents以及模板语法. http://lewis617.github.io/angular2-tutorial/hellowold/ 例子 这个例子非常简单,是个双向数据绑定. 运行方法: 全局安装http-server npm install -g http-server 公共部分 公共部分就是你直接复制粘贴拿去用的部分,包括: 1.index.html 2.lib 3.app/main.t

angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

今天我们要讲的是ng2的路由系统. 例子 例子是官网的例子,包含一个“危机中心”和“英雄列表”,都在一个app中,通过路由来控制切换视图.还包含了promise的用法,服务的用法等多个知识点. 源代码: https://github.com/lewis617/angular2-tutorial/tree/gh-pages/router 运行方法: 在根目录下运行: http-server 引入库文件设置base href 路由并不在ng2中,需要我们额外引入,另外我们需要设置base href,

angular2系列教程(六)升级装备、pipe

今天,我们要讲的是angualr2的pipe这个知识点,但是在这之前我们需要升级一下我们的装备,因为之前的装备太“寒酸”了. 例子 这个例子包含两个pipe,一个是stateful,一个是stateless,是直接复制官方的例子.本例子还包含了我对AngularClass/angular2-webpack-starter这个牛逼starter的改写,我会详细讲解配置. 源代码 没有测试 AngularClass/angular2-webpack-starter 这里面包含了Angular 2 (

Influx Sql系列教程九:query数据查询基本篇二

前面一篇介绍了influxdb中基本的查询操作,在结尾处提到了如果我们希望对查询的结果进行分组,排序,分页时,应该怎么操作,接下来我们看一下上面几个场景的支持 在开始本文之前,建议先阅读上篇博文: 190813-Influx Sql系列教程八:query数据查询基本篇 0. 数据准备 在开始查询之前,先看一下我们准备的数据,其中name,phone为tag, age,blog,id为field > select * from yhh name: yhh time age blog id name

angular2系列教程(五)Structural directives、再谈组件生命周期

今天,我们要讲的是structural directives和组件生命周期这两个知识点.structural directives顾名思义就是改变dom结构的指令.著名的内建结构指令有 ngIf, ngSwitch and ngFor. 例子 例子是我自己改写的,编写一个structural directives,然后通过这个指令实例化和注销组件,在此同时监视组件生命周期. 源代码 UnlessDirective 这个指令是官网示例中的指令. src/unless.directive.ts im

angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation

今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子: 上节课,我们讲解了英雄列表,这节课我们讲解危机中心. 源代码: https://github.com/lewis617/angular2-tutorial/tree/gh-pages/router 运行方法: 在根目录下运行: http-server 路由嵌套 我们在app/app.component.ts中定义了路由url和视图组件,其中包括这样一项: app/app.componen

angular2系列教程(二)模板语法

今天我们要讲的是angualr2的模板语法,官网写的很清楚,但我也用通俗易懂的讲法再罗列一下吧! 例子 源代码 运行方法: npm install npm run play 打开8080端口.这个例子是我写的小demo,介绍了常用的几种模板语法. 属性绑定 不需要特别的指令,只需要用[value]就可以了,并不只有value,[]里面可以是任何常用的html元素的属性! src/app.html <input [value]="firstName" [placeholder]=&

Spring Boot2 系列教程 (九) | SpringBoot 整合 Mybatis

前言 如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,本文通过注解的形式实现. 什么是 Mybatis MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生 Map 使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记