介绍
这篇文章主要介绍JS异步执行结果获取的方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<强>回调强>
这是最传统的方法了,也是最简单的,如下代码
function foo (cb), { ,setTimeout (function (), { ,cb(1);//,通过参数把结果返回 ,},2000); } foo(函数(结果),{,//调用foo方法的时候,通过回调把方法返回的数据取出来 ,console.log(结果); })
<>强承诺强>
承诺是ES6里加入的新对象,它可以把一个异步执行的方法封装成支持同步操作的方法,结合async/等待完美、下面说一下它是怎么封装一个方法的
function foo (), { ,return new 承诺((解决,,拒绝),=祝辞,{ ,setTimeout (function (), { 解决(1);才能,//,通过,resolve 参数把成功的结果返回//才能,拒绝(& # 39;错误# 39;);,//,通过,reject 参数把错误信息返回 ,},2000); ,}) }//,调用 foo () ,不要犹豫(result =祝辞,console.log(结果)) ,.catch (error =祝辞,console.log(错误));
从上面例子可以看的出,保证取值使用的是区间()函数,异常处理用的是.catch()函数
<强> rxjs 强>
rxjs是一种设计思想的javascript语言的实现框架,rx原名是:ReactiveX
官网是http://reactivex。io/
开源地址https://github.com/ReactiveX/rxjs
rx口号是万物皆是流,跟java里万物皆对象挺像的,它的api也全都是对流进行操作,写起来还是很爽的,下面看一下rxjs怎么封装一个异步执行操作
注意,用这货首先要安装它在自己的项目里,然后再引入依赖,如果是浏览器环境可以引入js
import {, Observable },得到& # 39;rxjs& # 39;; function foo (), { ,return new 观察(观察),=祝辞,{ ,setTimeout (function (), { observe.next才能(1),,//,通过,observe.next(),方法把成功的结果返回//才能,observe.error(& # 39;错误# 39;);,//,通过,observe.error 方法把错误信息返回 ,},2000); ,}) }//,调用 foo () ,.subscribe ( ,result =祝辞console.log(结果), ,error =祝辞console.log(错误) 之前,);>可以看到它跟承诺很像,就是变了几个参数名,不过它可比承诺强大多了
下面来说一下rxjs里的取消操作,没错请求还能取消,这骚操作也只有rxjs能实现了
import {, Observable },得到& # 39;rxjs& # 39;; function foo (), { ,return new 观察(观察),=祝辞,{ ,setTimeout (function (), { observe.next才能(1),,//,通过,observe.next(),方法把成功的结果返回//才能,observe.error(& # 39;错误# 39;);,//,通过,observe.error 方法把错误信息返回 ,},2000); ,}) }//,调用,方法里2 s后返回数据 const o =, foo () .subscribe ( ,result =祝辞console.log(结果), ,error =祝辞console.log(错误) );//,设置一个定时器1 s后取消订阅,这样控制台里就不会打印出结果了,这个请求也就被取消了 setTimeout (function (), { ,o.unsubscribe();,//,取消订阅 },,1000);rxjs除了取消执行外,还有一个牛逼的功能,循环执行,对一个请求可以一直接收它返回的结果,看下下面的例子就明白了
import {, Observable },得到& # 39;rxjs& # 39;; function foo (), { ,return new 观察(观察),=祝辞,{ ,let count =, 0; ,setInterval(函数(),{ observe.next才能(计数+ +);,//,通过,observe.next(),方法把成功的结果返回//才能,observe.error(& # 39;错误# 39;);,//,通过,observe.error 方法把错误信息返回 ,},1000); ,}) }//,调用 foo () .subscribe ( ,result =祝辞console.log(结果),,//,这行会每隔1 s打印一条数据 ,error =祝辞console.log(错误) );因为在ReactiveX里一切皆是流,所以也就有很多对流操作的api,比如争吵,地图等,类似于java8里的流的操作,下面看一下例子说明白了
import {, Observable },得到& # 39;rxjs& # 39;;//,对流操作要引入操作类 import {,地图,filter },得到& # 39;rxjs/运营商# 39;; function foo (), { ,return new 观察(观察),=祝辞,{ ,let count =, 0; ,setInterval(函数(),{ observe.next才能(计数+ +);,//,通过,observe.next(),方法把成功的结果返回//才能,observe.error(& # 39;错误# 39;);,//,通过,observe.error 方法把错误信息返回 ,},1000); ,}) }//,调用 const o =, foo (); o.pipe ( ,过滤器((价值:号码),=祝辞,value %, 2,===, 0), ,地图(价值:数字),=祝辞,value *=, 2) ).subscribe (data =祝辞,console.log(数据),JS异步执行结果获取的方法有哪些