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 学习笔记01 JQuery初接触
May 06 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
May 23 Javascript
JavaScript通过RegExp实现客户端验证处理程序
May 07 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
Oct 22 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
Nov 17 Javascript
分享12个实用的jQuery代码片段
Mar 09 Javascript
JS实现仿PS的调色板效果完整实例
Dec 21 Javascript
浅谈angular4 ng-content 中隐藏的内容
Aug 18 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
React中使用UMEditor的方法示例
Dec 27 Javascript
JavaScript基于用户照片姓名生成海报
May 29 Javascript
js代码编写无缝轮播图
Sep 13 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脚本的10个技巧(7)
2006/10/09 PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
收集的DedeCMS一些使用经验
2007/03/17 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
js left,right,mid函数
2008/06/10 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
JS面向对象编程之对象使用分析
2010/08/19 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
50行Python代码实现人脸检测功能
2018/01/23 Python
python实现支付宝转账接口
2019/05/07 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
Jdbc数据访问技术面试题
2012/03/30 面试题
工程造价管理专业大专生求职信
2013/10/06 职场文书
外语专业毕业生个人的自荐信
2013/11/19 职场文书
建筑投标担保书
2014/05/20 职场文书
岗位聘任报告
2015/03/02 职场文书
刮痧观后感
2015/06/05 职场文书