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 相关文章推荐
Javascript 判断 object 的特定类转载
Feb 01 Javascript
js滚动条多种样式,推荐
Feb 05 Javascript
Javascript的并行运算实现代码
Nov 19 Javascript
GRID拖拽行的实例代码
Jul 18 Javascript
jquery更换文章内容与改变字体大小代码
Sep 30 Javascript
Bootstrap 组件之按钮(二)
May 11 Javascript
node.js中express中间件body-parser的介绍与用法详解
May 23 Javascript
js断点调试经验分享
Dec 08 Javascript
web前端页面生成exe可执行文件的方法
Feb 08 Javascript
小程序开发基础之view视图容器
Aug 21 Javascript
JavaScript实现简单的弹窗效果
May 19 Javascript
让你30分钟快速掌握vue3教程
Oct 26 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
php在字符串中查找另一个字符串
2008/11/19 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
Yii清理缓存的方法
2016/01/06 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
用JavaScript显示随机图像或引用
2009/04/21 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
python在windows下实现备份程序实例
2014/07/04 Python
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
2019/03/13 Python
Python 实现数据结构中的的栈队列
2019/05/16 Python
python3获取当前目录的实现方法
2019/07/29 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
Python 在局部变量域中执行代码
2020/08/07 Python
软件设计的目标是什么
2016/12/04 面试题
女大学生毕业找工作的自我评价
2013/10/03 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
《得道多助,失道寡助》教学反思
2014/04/19 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
2016猴年春节问候语
2015/11/11 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python