SNS项目笔记<四>--RXjs简要用法

关于RX系列,博主不需要多讲,源自C#开发,纯粹的响应链状式的编程,让大型项目的代码简略化以及底层优化。博主只要编程者记住一个概念就行,并不是所有编程适合RX,但是RX是解决动态响应,以及多线程的首选。Angular升级到2过后,一直延续着promise做流处理,但是它自身携带的RXjs又是处理流的利器。本篇从实战角度出发,简要的概括它的两个使用方法

1、极简HTTP请求

1.1、创建provider

在命令行输入ionic g provider youProviderName 在创建好后,系统会自动导入从@angular/http里导入Http这个类,方便后续做直接使用此类做HTTP请求。

1.2、请求头处理
/**
     定义全局头部
     1、指定Content-Type 和服务器互相以json交互<RequestBody 为json>
     2、指定ACCESS_TOKEN用于登陆验证
*/
private header = new Headers({
    'Content-Type': 'application/json',
    'ACCESS_TOKEN': this.getToken()
  });

getToken() {
    let token = localStorage.getItem("token");
    return token || ""
  }

自定义请求头后我们可以完全掌握与后台的请求对接方式,在后期无论以表单传文件,或者是soap请求方面都可以自定义,这里只做简单的说明。

1.3、get、post请求
//由于rxjs包很大,内容很多,我们取有需要的即可
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch' 
export class BaseServiceProvider{
......
/**
使用自定义头部option
*/
private option = new RequestOptions({heads:this.header})

/**
get请求,注册请求体
url:请求url
ResponseBody: 自定义pojo类
*/
get():Observable<ResponseBody>{
    return this.http.get(url,this.option)
.map(response=>response.json())
.catch(this.handleError)
}

/**
post请求,注册请求体
url:请求url
ResponseBody:自定义pojo类
*/
post(param):Observable<ResponseBody>{
    return this.http.post(url,{'key',param},this.option)
.map(response=>response.json())
.catch(this.handleError)
}


//这里直接使用官方教程的类,处理错误信息
private handleError(error: Response | any) {
    this.dialog.dismiss();
    let errMsg: string;
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body.error || JSON.stringify(body);
      errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
    } else {
      errMsg = error.message ? error.message : error.toString();
    }
    console.error(errMsg);
    return Observable.throw(errMsg);
  }
......

注意:这里的get,post源码中是这样写的:
   /**
     * Performs a request with `get` http method.
     */
    get(url: string, options?: RequestOptionsArgs): Observable<Response>;
    /**
     * Performs a request with `post` http method.
     */
    post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>;

option为可携带参数,所以在某些特定的情况下可以使用默认的头部进行HTTP请求

1.4、建立请求响应方法
   //某个需要请求的类里:
   export class RealPage{
    constructor(public navCtrl: NavController, public navParams: NavParams, public baseService:BaseServiceProvider) {
    }
    param:any  //请求携带的参数,这里可以自定义为number、string、boolean、Array类型
    ionViewDidLoad(){
        //建立get请求
        this.baseService.get()
.subscribe(
            data => this.responseData = data, Error => {//请求失败,处理信息}, () => {//请求成功,ResponseData数据处理}
        );
        //建立post请求
        this.baseService.post(this.param)
.subscribe(
            data => this.responseData = data, Error => {//请求失败,处理信息}, () => {//请求成功,ResponseData数据处理}
        );

    }

} 

通过以上使用RXjs方法,我们很快的就完成了HTTP请求的搭建,很简单的响应式模式,很迅捷的编程体验RxJS,你值得使用。

1.5、简单理解Rx

很多人难以理解Rx,其实很简单,因为翻译文档很拗口,导致很多东西描述起来非常困难,当然想知道原理就得看源码去理解了。这里就简单理解,一个特殊的观察者,监听器--Observable,一个注册机制 --Subscribe, 一经注册便可拥有传输能力和响应机制,想使用,必须注册,就和需要啥啥权益注册很多会员一样,仅此而已。

2、回调监听--组件中通讯

在写ionic时发现当页面pop()的时候,竟无返回响应机制,这个时候,页面与页面就可以使用RXjs进行传播串接起来,类似于Android里面的EventsBus,Otto等。

2.1、封装provider

<<借鉴の博客>>

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class RxBus{

    private param: any;
    private subject: Subject<any> = new Subject()

    setListener(param: any): void {
        this.param= param;
        this.subject.next(param);
    }

    bus(): Observable<any> {
        return this.subject.asObservable();
    }
}
2.2、监听与回调
export class MainPage {
     constructor(public eventsBus:RxBus) {}

     ionViewDidLoad() {
        //注册监听器
        this.eventsBus.bus().subscribe(param=>{
                 //处理param
        })
      }

}  
export class NextPage {
      constructor(public eventsBus:RxBus,public nav:NavController) {}
      
      //回到MainPage页面
      backClick(){
             // 设置回调
             this.eventsBus.setListener("param");
             this.nav.pop();
      }
}

这样一来,MainPage就会接收到来自NextPage的param,非常好的实现了页面间的通讯。

结尾的话:这就是Rx的代码魅力,非常简单的完成很多任务,后面会有相册处理方面的博文,到时候着重讲解RXjs处理文件的方式,尽请期待!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,149评论 25 707
  • 一.背景介绍 Rx(Reactive Extension -- 响应式扩展 http://reactivex.io...
    爱上Shu的小刺猬阅读 2,045评论 1 3
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,822评论 6 342
  • 左右不过是写自己的小情绪。我也觉得这样写作是没多大出息,可是,心里觉得烦闷了,如果连文字都不接受,溢满胸怀的烦闷到...
    茶润人生阅读 118评论 2 0