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 相关文章推荐
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
Aug 15 Javascript
js 小数取整的函数
May 10 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
Dec 02 Javascript
javascript实现动态侧边栏代码
Feb 19 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
Jan 08 Javascript
jQuery Plupload上传插件的使用
Apr 19 jQuery
jQuery 1.9版本以上的浏览器判断方法代码分享
Aug 28 jQuery
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
Oct 19 Javascript
小程序实现左滑删除效果
Jul 25 Javascript
如何检测JavaScript中的死循环示例详解
Aug 30 Javascript
Vue实现随机验证码功能
Dec 29 Vue.js
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
基于mysql的bbs设计(五)
2006/10/09 PHP
初识Laravel
2014/10/30 PHP
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
js面向对象的写法
2016/02/19 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
AngularJs directive详解及示例代码
2016/09/01 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
Python实现堆排序的方法详解
2016/05/03 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
解析python实现Lasso回归
2019/09/11 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
python接口自动化框架实战
2020/12/23 Python
物流专业大学生的自我鉴定
2013/11/13 职场文书
公司2015年终工作总结
2015/05/26 职场文书
千与千寻观后感
2015/06/04 职场文书
MySQL常见优化方案汇总
2022/01/18 MySQL
python三子棋游戏
2022/05/04 Python
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL