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 相关文章推荐
jquery连缀语法如何实现
Nov 29 Javascript
js替换字符串的所有示例代码
Jul 23 Javascript
js获取select标签选中值的两种方式
Jan 09 Javascript
javascript中拼接HTML字符串的最快、最好的方法
Jun 07 Javascript
jQuery构造函数init参数分析续
May 13 Javascript
微信小程序 loading(加载中提示框)实例
Oct 28 Javascript
如何解决vue与传统jquery插件冲突
Mar 20 Javascript
微信小程序之批量上传并压缩图片的实例代码
Jul 05 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
微信小程序webview实现长按点击识别二维码功能示例
Jan 24 Javascript
JavaScript页面加载事件实例讲解
Sep 01 Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 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
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
一些mootools的学习资源
2010/02/07 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
python的绘图工具matplotlib使用实例
2014/07/03 Python
python文件和目录操作函数小结
2014/07/11 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
Django的models中on_delete参数详解
2019/07/16 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
Python递归函数特点及原理解析
2020/03/04 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
出生医学证明样本
2014/01/17 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
网络教育自我鉴定
2014/02/04 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
在职员工证明书
2014/09/19 职场文书
保安辞职信范文
2015/02/28 职场文书
教务处干事工作总结
2015/08/14 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js