【JS】Promise与RxJS处理异步

news/2024/7/11 1:16:31 标签: typescript, angular, javascript, es6

Promise与RxJS处理异步

    • 一、常见的异步编程方法
      • 1. 回调函数
      • 2. 事件监听/发布订阅
      • 3. Promise
      • 4. RxJS
    • 二、Promise与RxJS处理异步对比
    • 三、Angular6.x之前使用RxJS的工具函数map/filter
    • 四、Angular6.x之后RxJS6.x的变化以及使用

一、常见的异步编程方法

1. 回调函数

2. 事件监听/发布订阅

3. Promise

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

javascript">function runAsync1(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务执行完成1');
            resolve('数据1');
        }, 1000);
    });
    return p;            
}
function runAsync2(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务执行完成2');
            resolve('数据2');
        }, 2000);
    });
    return p;            
}
function runAsync3(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务执行完成3');
            resolve('数据3');
        }, 2000);
    });
    return p;            
}
 
runAsync1()
.then(function(data){
    console.log(data);
    return runAsync2();
})
.then(function(data){
    console.log(data);
    return runAsync3();
})
.then(function(data){
    console.log(data);
});

控制台输出

异步任务执行完成1
数据1
异步任务执行完成2
数据2
异步任务执行完成3
数据3

promise
阮一峰promise

4. RxJS

二、Promise与RxJS处理异步对比

Promise 处理异步:

javascript">let promise = new Promise(resolve => { 
	setTimeout(() => {resolve('promise timeout'); }, 2000);
	});
promise.then(value => console.log(value)); //调用

RxJS 处理异步:

javascript">import {Observable} from 'rxjs'; //引入异步对象

let stream = new Observable(observer => { 
	setTimeout(() => {observer.next('observable timeout'); }, 2000);
	});
stream.subscribe(value => console.log(value)); //调用

RxJS 是使用 Observables 的响应式编程的库,它使编写异步或基于回调的代码更容易。

从上面列子可以看到 RxJS 和 Promise 的基本用法非常类似,除了一些关键词不同。Promise 里面用的是 then() 和 resolve(),而 RxJS 里面用的是 next() 和 subscribe()。
实际上,RxJS更强大一些,它可以中途撤回unsubscribe,可以发射多个值,可以不断触发下一个值,提供了多种工具函数等。

三、Angular6.x之前使用RxJS的工具函数map/filter

注意:Angular6以后的版本,必须安装rxjs-compat模块才可以使用map、filter。Angular6后官方使用的是RXJS6的新特性
npm install rxjs-compat

四、Angular6.x之后RxJS6.x的变化以及使用

RXJS6改变了包的结构,主要变化在import的方式和operator上面以及使用pipe()

javascript">import {Observable} from 'rxjs'; //引入异步对象
import {map,rilter} from 'rxjs/operators';

let stream = new Observable<any>(observer => {
	let count = 0;
	setInterval(() => {
		observer,next(count++);
	},1000);
});
stream.pipe(
	filter(val => val%2==0),  //对数据筛选过滤
	map(value => {return value*value}) //对数据进行处理(如把json字符串转换成json对象)
).subscribe(value => console.log("filter">value));

http://www.niftyadmin.cn/n/736383.html

相关文章

搞懂json.stringify()和json.parse()

简单来说 JSON.parse()【从一个字符串中解析出json对象】 例子&#xff1a; //定义一个字符串var data{"name":"goatling"}//解析对象​​JSON.parse(data)结果是&#xff1a;​name:"goatling"JSON.stringify()【从一个对象中解析出字符串】…

canvas知识点总结

Canvas canvas 最早由Apple引入WebKit,用于Mac OS X 的 Dashboard,后来又在Safari和Google Chrome被实现。 基于 Gecko 1.8的浏览器,比如 Firefox 1.5, 同样支持这个元素。 <canvas> 元素是WhatWG Web applications 1.0规范的一部分,也包含于HTML 5中。 体验Canvas 什么…

【Angular】Angular中的数据交互(get/post/jsonp/axios)

Angular中的数据交互&#xff08;get/post/jsonp/axios&#xff09;1.get获取数据2.post提交数据3.jsonp获取服务器数据&#xff0c;可以跨域4.axios第三方模块Angular5.x之后使用get、post请求服务器数据使用的是HttpClientModule模块。 1.get获取数据 1、在app.module.ts中引…

正则表达式小结

正则表达式 了解正则表达式基本语法能够使用JavaScript的正则对象 正则表达式简介 什么是正则表达式 正则表达式&#xff1a;用于匹配规律规则的表达式&#xff0c;正则表达式最初是科学家对人类神经系统的工作原理的早期研究&#xff0c;现在在编程语言中有广泛的应用。正…

浏览器内核区别

任何上过网的用户对浏览器是再熟悉不过了。只是用户看到仅仅只是浏览器本身&#xff0c;却很少能看到浏览器最核心的部分—浏览器内核。从第一款libwww&#xff08;Library WorldWideWeb&#xff09;浏览器发展至今已经经历了无数竞争与淘汰了。现在国内常见的浏览器有&#xf…

js获取当前页内的iframe页面的元素

遇到一个需求&#xff0c;项目使用的是pdf.js, 在显示pdf的过程中&#xff0c;需要点击一个下载按钮来下载文件。但是pdf.js本身就带有下载按钮&#xff0c;&#xff08;即有下载功能&#xff09;。所以我想点击父页面的按钮&#xff0c;触发子页面iframe的下载按钮。 1. 按钮页…

使用伪类:before在元素前面插入css绘制的图标

项目中总是能遇到奇怪的需求&#xff0c;比如今天就遇到了需要在某个弹窗标题元素前面插入一个图标。但是最好不要引入图片。 1.标题元素前面插入一个图标 原来的弹窗 新弹窗 实现代码 主要目的就是在title前面通过伪类:before插入一个css样式元素。 使用border-radius: 50%…

js/ts获取当日零点时间,本周第一天零点时间,本月第一天零点时间,本年第一天零点时间

//获取当天零点时间getFirstDay(){return new Date(new Date().setHours(0, 0, 0, 0));}//获取本周周一零点时间getThisWeekFirstDay(){let today new Date();let day today.getDay()||7;return new Date(today.getFullYear(),today.getMonth(),today.getDate()1-day);}//获取…