异步模式之JS、Promise、RXJS

原文出处:http://blog.youkuaiyun.com/u010730897/article/details/78390992

在我们的开发过程中经常会遇到一个问题:一个方法需要在另一个方法执行结束之后才开始执行。这就是我们所说的异步。

现在我们假设有两个方法分别为fn1(),fn2();且fn2()在fn1()执行完后才开始执行。

JavaScript实现

使用setTimeout延迟2s执行fn2(),使用这种方式有个缺点是fn1()的执行时间不可控,而且如果fn2()需要fn1()的结果作为参数的话,这样可能会导致整个流程混乱。

fn1(callback){
setTimeout(function () {
callback();
}, 2000)
}

fn1(fn2);
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Promise实现

Promise的特点: 
1、Pormise对象只要新建则会立即执行。 
2、Promise的三种状态Pending(执行中)、Resolved(执行成功)、Rejected(执行失败) 
3、状态一旦改变就不会再改变了。不论在后面怎么调用then,实际上的异步操作只会被执行一次,多次调用没有效果;

let fn1 = new Promise((resolve,reject)=>{
console.log("Strat Promise");
resolve(1);//执行成功并将pending状态改变为resolved
//或者reject(0);执行失败并将pending状态改变为rejected
})

fn1.then((value)=>{
console.log(value);
fn2();
}).catch((error)=>{
console.log(error);
})
输出结果:
Strat Promise
1
如果失败则输出:
Strat Promise
0
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

RXJS实现

首先我们在Promise的基础之上已经发现Promise可以解决大部分异步问题了,但是如果我们想要在Promise resolve()之后再次resolve()怎么办?我们在then()之前不想立即执行的时候又该怎么办?所以出现了RXJS。

RxJS是使用Observables进行反应式编程的库,使编写异步或基于回调的代码更容易。

这里简单使用RXJS的Observable(这里可以理解为是一个对象)

将onSubscription函数转换为实际的Observable。 每当有人订阅该Observable时,该函数将使用Observer实例作为第一个也是唯一的参数进行调用。 onSubscription应该包含Observers的next,error和complete方法。

let observable = Rx.Observable.create(function (observer) {
observer.next(1);
observer.next(2);
observer.next(3);
observer.complete();
});
observable.subscribe(value => console.log(value),
err => { }, () => console.log('this is the end'));
//输出结果:
1 
2
3
this is the end
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

只有当observer.complete();方法执行的时候才会回调。同样只用当observer.error()执行的时候,error的回调才会执行。

这里的observable不会立即执行,只有放observable.subscribe()的时候才开始执行里面的方法。 
并且observable.subscribe()在不同时候调用都可以返回值,除非调用observable.unsubscribe()中断执行。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值