JS异步执行结果获取的3种解决方式


Posted in Javascript onFebruary 19, 2019

前言

JS异步执行机制具有非常重要的地位,尤其体现在回调函数和事件等方面。

但异步有时候很方便,有时候却很让人恼火,下面来总结一下异步执行结果获取的方法

回调

这是最传统的方法了,也是最简单的,如下代码

function foo(cb) {
 setTimeout(function() {
 cb(1); // 通过参数把结果返回
 }, 2000);
}

foo(function(result) { // 调用foo方法的时候,通过回调把方法返回的数据取出来
 console.log(result);
})

Promise

Promise是ES6里加入的新对象,它可以把一个异步执行的方法封装成支持同步操作的方法,结合 async/await 完美,下面说一下它是怎么封装一个方法的

function foo() {
 return new Promise((resolve, reject) => {
 setTimeout(function() {
  resolve(1); // 通过 resolve 参数把成功的结果返回
  // reject('error'); // 通过 reject 参数把错误信息返回
 }, 2000);
 })
}

// 调用
foo()
 .then(result => console.log(result))
 .catch(error => console.log(error));

从上面例子可以看出,Promise取值使用的是 .then() 函数,异常处理用的是 .catch() 函数

rxjs

rxjs 是一种设计思想的javascript语言的实现框架,rx原名是:ReactiveX

官网是 http://reactivex.io/

开源地址 https://github.com/ReactiveX/rxjs

rx口号是万物皆是流,跟java里万物皆对象挺像的,它的api也全都是对流进行操作,写起来还是很爽的,下面看一下rxjs怎么封装一个异步执行操作

注意,用这货首先要安装它在自己的项目里,然后再引入依赖,如果是浏览器环境可以引入js

import { Observable } from 'rxjs';

function foo() {
 return new Observable((observe) => {
 setTimeout(function() {
  observe.next(1); // 通过 observe.next() 方法把成功的结果返回
  // observe.error('error'); // 通过 observe.error 方法把错误信息返回
 }, 2000);
 })
}

// 调用
foo()
 .subscribe(
 result => console.log(result),
 error => console.log(error)
 );

可以看到它跟Promise很像,就是变了几个参数名,不过它可比Promise强大多了

下面来说一下rxjs里的取消操作,没错请求还能取消,这骚操作也只有rxjs能实现了

import { Observable } from 'rxjs';

function foo() {
 return new Observable((observe) => {
 setTimeout(function() {
  observe.next(1); // 通过 observe.next() 方法把成功的结果返回
  // observe.error('error'); // 通过 observe.error 方法把错误信息返回
 }, 2000);
 })
}

// 调用,方法里2s后返回数据
const o = foo().subscribe(
 result => console.log(result),
 error => console.log(error)
);

// 设置一个定时器1s后取消订阅,这样console里就不会打印出结果了,这个请求也就被取消了
setTimeout(function() {
 o.unsubscribe(); // 取消订阅
}, 1000);

rxjs除了取消执行外,还有一个牛逼的功能,循环执行,对一个请求可以一直接收它返回的结果,看下下面的例子就明白了

import { Observable } from 'rxjs';

function foo() {
 return new Observable((observe) => {
 let count = 0;
 setInterval(function() {
  observe.next(count++); // 通过 observe.next() 方法把成功的结果返回
  // observe.error('error'); // 通过 observe.error 方法把错误信息返回
 }, 1000);
 })
}

// 调用
foo().subscribe(
 result => console.log(result), // 这行会每隔1s打印一条数据
 error => console.log(error)
);

因为在 ReactiveX 里一切皆是流,所以也就有很多对流操作的api,比如 fliter, map 等,类似于java8里的 stream 的操作,下面看一下例子说明白了

import { Observable } from 'rxjs';
// 对流操作要引入操作类
import { map, filter } from 'rxjs/operators';

function foo() {
 return new Observable((observe) => {
 let count = 0;
 setInterval(function() {
  observe.next(count++); // 通过 observe.next() 方法把成功的结果返回
  // observe.error('error'); // 通过 observe.error 方法把错误信息返回
 }, 1000);
 })
}

// 调用
const o = foo();
o.pipe(
 filter((value: number) => value % 2 === 0),
 map((value: number) => value *= 2)
).subscribe(data => console.log(data));

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
又一个图片自动缩小的JS代码
Mar 10 Javascript
javaScript 删除字符串空格多种方法小结
Oct 24 Javascript
jQuery取id有.的值的方法
May 21 Javascript
laytpl 精致巧妙的JavaScript模板引擎
Aug 29 Javascript
深入浅析同源策略和跨域访问
Nov 26 Javascript
JS使用cookie设置样式的方法
Jun 30 Javascript
浅谈jquery上下滑动的注意事项
Oct 13 Javascript
JavaScript数据结构中串的表示与应用实例
Apr 12 Javascript
[js高手之路]寄生组合式继承的优势详解
Aug 28 Javascript
JS解析后台返回的JSON格式数据实例
Aug 06 Javascript
JQuery常用简单动画操作方法回顾与总结
Dec 07 jQuery
vue-video-player视频播放器使用配置详解
Oct 23 Javascript
jQuery AJAX与jQuery事件的分析讲解
Feb 18 #jQuery
基于node.js实现爬虫的讲解
Feb 18 #Javascript
简单实现vue中的依赖收集与响应的方法
Feb 18 #Javascript
vue实现的网易云音乐在线播放和下载功能案例
Feb 18 #Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
Feb 18 #Javascript
vue-cli3环境变量与分环境打包的方法示例
Feb 18 #Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
Feb 18 #Javascript
You might like
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
Convert Seconds To Hours
2007/06/16 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
vue中使用input[type="file"]实现文件上传功能
2018/09/10 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
pandas 小数位数 精度的处理方法
2018/06/09 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
python访问hdfs的操作
2020/06/06 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
python 监控logcat关键字功能
2020/09/04 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
HTML5实现动画效果的方式汇总
2016/02/29 HTML / CSS
自荐信格式技巧有哪些呢
2013/11/19 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
植树造林的宣传标语
2014/06/23 职场文书
创先争优承诺书
2015/01/20 职场文书
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技