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实现数组转换成json
Jun 26 Javascript
Javascript实现鼠标右键特色菜单
Aug 04 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
Aug 25 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
JQuery validate插件验证用户注册信息
May 11 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
Dec 03 Javascript
自制简易打赏功能的实例
Sep 02 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
Nov 06 Javascript
Promise.all中对于reject的处理方法
Aug 01 Javascript
在微信小程序中使用图表的方法示例
Apr 25 Javascript
浅谈关于vue中scss公用的解决方案
Dec 02 Javascript
借助云开发实现小程序短信验证码的发送
Jan 06 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中使用反射技术的架构插件使用说明
2010/05/18 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
实习自我评价怎么写
2013/12/02 职场文书
银行员工辞职信范文
2014/01/20 职场文书
农贸市场管理制度
2014/01/31 职场文书
副厂长岗位职责
2014/02/02 职场文书
酒店行政人事部经理职务说明书
2014/02/26 职场文书
服务口号大全
2014/06/11 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
大一新生检讨书
2014/10/29 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
六年级作文之关于梦
2019/10/22 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
Selenium浏览器自动化如何上传文件
2022/04/06 Python