当前位置: 首页 > Web前端 > HTML

在angular8+中使用observable使用async-await

时间:2023-03-29 12:09:08 HTML

不是废话,直接得出结论js中的observable不能直接使用async/await作为流控标识,例如observable:Observable=new可观察的;constructor(){this.observable=Observable.create((item:any)=>{//一秒后输出结果setTimeout(()=>{item.next('result');item.complete();},1000)})}ngOnInit(){console.log(1);letstartTime=newDate().getTime()this.observable.subscribe((res)=>{letendTime=newDate().getTime()letresult=Math.floor(newDate(endTime-startTime).getTime()/1000);console.log(res,'timespent',result,'seconds')})console.log(2)}很明显,执行结果就是then,是不是可以像promise一样使用async/await?对ngOnInite()方法稍作改动并添加async/awaitasyncngOnInit(){console.log(1);letstartTime=newDate().getTime()awaitthis.observable.subscribe((res)=>{letendTime=newDate().getTime()letresult=Math.floor(newDate(endTime-startTime).getTime()/1000);console.log(res,'消费time',result,'second')})console.log(2)}啊哈,不好,小编提示你不信邪,跑看看。上面说了流控不行,Observable不支持直接流程控制,有两种解决方案。先说一个简单案例的解决方法。第一个,转换为promise的操作如下:asyncngOnInit(){console.log(1);letstartTime=newDate().getTime()awaitthis.observable.toPromise().then((res)=>{letendTime=newDate().getTime()letresult=Math.floor(newDate(endTime-startTime).getTime()/1000);console.log(res,'耗时',result,'seconds')})console.log(2)}直接用.toPromise()方法转换成一个promise,这样async/await就可以工作了,当然,也可以在promise中使用then方法。可以看出,现在程序会等待promise执行完毕再输出2,即流程控制生效。注意,有些朋友在手动写observables的时候,并没有在里面写complete,这样执行toPromise的时候,then里面的代码就不会运行了,因为promise要等到底层代码完成后才会去解析,也就是手写的observable一定要记得写complete当然,转换成promise并不能解决所有问题。比如下面这种情况,当用户点击页面时,需要同时发送50个请求,但是用户很可能在所有数据请求完成之前就跳过了,所以很有可能是20-30requests都是无效请求。然后,无效的请求需要直接取消。我们知道promises不能取消已经发送的请求。你可以通过throw或者reject来触发promises的catch操作,但这只是代表你不再关心请求的结果,请求依然存在,结果依然会被返回。除非用户在所有请求完成之前点击了浏览器的停止加载按钮,否则请求会从pending状态变为cancel或者,使用subscribe,这是它相对于promise的优势之一。取消订阅请求很简单:单个请求this.observable.subscribe((res)=>{}).unsubscribe()的情况下,只需要在最后加上unsubscribe,请求就会变成取消状态,将不再占用请求的资源。那么,回到上面的问题,简化一下,我是不是既可以取消已经发送的请求,又可以控制代码的流向?答案是肯定的,把promise和observable一起用就行了。第二种方案,最终代码如下observableArray:Subscription=newSubscription;observable:Observable=newObservable;constructor(){this.observable=Observable.create((item:Observer)=>{setTimeout(()=>{item.next('Complete');item.complete();},1000)})}asyncngOnInit(){控制台。日志(1);letstartTime=newDate().getTime()awaitnewPromise((resolve,reject)=>{this.observableArray.add(this.observable.subscribe((res)=>{resolve(true)letendTime=newDate().getTime()letresult=Math.floor(newDate(endTime-startTime).getTime()/1000);console.log(res,'耗时',result,'second')}))})console.log(2)}ngOnDestroy():void{this.observableArray.unsubscribe()}运行结果的思路是通过promise来控制代码流,以及然后使用对象接收Observable,控制是否取消请求,即可以随时根据自己的意愿取消已经发送的请求,同时还可以控制流量代码的