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 事件绑定问题
Jan 01 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
Aug 01 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
Jan 24 Javascript
JS实现的四级密码强度检测功能示例
May 11 Javascript
vue之nextTick全面解析
May 17 Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 Javascript
打字效果动画的4种实现方法(超简单)
Oct 18 Javascript
npm 下载指定版本的组件方法
May 17 Javascript
[jQuery] 事件和动画详解
Mar 05 jQuery
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
May 17 Javascript
vue实现简单的日历效果
Sep 24 Javascript
JS防抖和节流实例解析
Sep 24 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提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Sublime开发python程序的示例代码
2018/01/24 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
Overload和Override的区别
2012/09/02 面试题
JAVA程序员自荐书
2014/01/30 职场文书
出纳会计岗位职责
2014/03/12 职场文书
环境建设实施方案
2014/03/14 职场文书
会计毕业生自荐书
2014/06/12 职场文书
多媒体教室标语
2014/06/26 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
详解Flask开发技巧之异常处理
2021/06/15 Python
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers