Angular异步数据流编程

1 目前常见的异步编程的几种方法

首先给出一个异步请求的实例:

import {Injectable} from '@angular/core';@Injectable({providedIn: 'root'
})
export class RequestServiceService {constructor() {}getData() {setTimeout(() => {let res = 'zhaoshuai-lc'return res}, 3000)}
}
import {Component, OnInit} from '@angular/core';
import {RequestServiceService} from "./services/request-service.service";@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit{constructor(public RequestServiceService: RequestServiceService) {}ngOnInit(): void {let data = this.RequestServiceService.getData()console.log(data)}
}

在这里插入图片描述

1.1 回调函数解决问题

import {Component, OnInit} from '@angular/core';
import {RequestServiceService} from "./services/request-service.service";@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit{constructor(public RequestServiceService: RequestServiceService) {}ngOnInit(): void {this.RequestServiceService.getData(data => {console.log(data)})}
}
import {Injectable} from '@angular/core';@Injectable({providedIn: 'root'
})
export class RequestServiceService {constructor() {}getData(callBack) {setTimeout(() => {let res = 'zhaoshuai-lc'callBack(res)}, 3000)}
}

在这里插入图片描述

1.2 Promise 处理异步

import {Injectable} from '@angular/core';@Injectable({providedIn: 'root'
})
export class RequestServiceService {constructor() {}getData() {return new Promise((resolve, reject) => {setTimeout(() => {let res = 'zhaoshuai-lc'resolve(res)}, 3000)})}
}
import {Component, OnInit} from '@angular/core';
import {RequestServiceService} from "./services/request-service.service";@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {constructor(public RequestServiceService: RequestServiceService) {}ngOnInit(): void {let promiseData = this.RequestServiceService.getData()promiseData.then(data => {console.log(data)})}
}

1.3 RxJS 处理异步

import {Injectable} from '@angular/core';
import {Observable} from "rxjs";@Injectable({providedIn: 'root'
})
export class RequestServiceService {constructor() {}getData() {return new Observable(observer => {setTimeout(() => {let res = 'zhaoshuai-lc'observer.next(res)}, 3000)})}
}
import {Component, OnInit} from '@angular/core';
import {RequestServiceService} from "./services/request-service.service";@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {constructor(public RequestServiceService: RequestServiceService) {}ngOnInit(): void {let observableData = this.RequestServiceService.getData()observableData.subscribe(data => {console.log(data)})}
}

从上面列子可以看到 RxJS 和 Promise 的基本用法非常类似,除了一些关键词不同。 Promise 里面用的是 then() 和 resolve(),而 RxJS 里面用的是 next() 和 subscribe()。

从上面例子我们感觉 Promise 和 RxJS 的用法基本相似。其实 Rxjs 相比 Promise 要强大很多。 比如 Rxjs 中可以中途撤回、Rxjs 可以发射多个值、Rxjs 提供了多种工具函数等等。

2 Rxjs unsubscribe 取消订阅

Promise 的创建之后,动作是无法撤回的。Observable 不一样,动作可以通过 unsbscribe() 方法中途撤回,而且 Observable 在内部做了智能的处理。

import {Component, OnInit} from '@angular/core';
import {RequestServiceService} from "./services/request-service.service";@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {constructor(public RequestServiceService: RequestServiceService) {}ngOnInit(): void {// 过一秒撤回let stream = this.RequestServiceService.getData()let res = stream.subscribe(data => {console.log(data)})setTimeout(() => {console.log('取消订阅了')res.unsubscribe()}, 1000)}
}

3 Rxjs 订阅后多次执行

如果我们想让异步里面的方法多次执行,这一点 Promise 是做不到的。对于 Promise 来说,最终结果要么 resolve(兑现)、要么 reject (拒绝),而且都只能触发一次。如果在同一个 Promise 对象上多次调用 resolve 方法, 则会抛异常。而 Observable 不一样,它可以不断地触发下一个值,就像 next() 这个方法的 名字所暗示的那样。

import {Injectable} from '@angular/core';
import {Observable} from "rxjs";@Injectable({providedIn: 'root'
})
export class RequestServiceService {constructor() {}getData() {return new Observable(observer => {setInterval(() => {let res = 'zhaoshuai-lc'observer.next(res)}, 1000)})}
}
import {Component, OnInit} from '@angular/core';
import {RequestServiceService} from "./services/request-service.service";@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {constructor(public RequestServiceService: RequestServiceService) {}ngOnInit(): void {let stream = this.RequestServiceService.getData()let res = stream.subscribe(data => {console.log(data)})}
}

4 Angualr6.x 之后使用 Rxjs 的工具函数 map,filter

import {Injectable} from '@angular/core';
import {Observable} from "rxjs";@Injectable({providedIn: 'root'
})
export class RequestServiceService {constructor() {}getData() {return new Observable(observer => {let count = 0;setInterval(() => {count++observer.next(count)}, 1000)})}
}
import {Component, OnInit} from '@angular/core';
import {RequestServiceService} from "./services/request-service.service";
import {filter, map} from 'rxjs/operators';@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {constructor(public RequestServiceService: RequestServiceService) {}ngOnInit(): void {let stream = this.RequestServiceService.getData()stream.pipe(filter(value => Number(value) % 2 == 0),map(value => Number(value) * Number(value))).subscribe(data => {console.log(data)})}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

creating server tcp listening socket 127.0.0.1:6379: bind No error

window下启动redis服务报错: creating server tcp listening socket 127.0.0.1:6379: bind No error 解决方案如下按顺序输入如下命令即可连接成功 redis-cli.exeshutdownexit运行:redis-server.exe redis.windows.conf shutdown出现以下错误&#xff…

如何将PDF文件转换成翻页电子书?这个网站告诉你

​随着电子书的普及,越来越多的人开始将PDF文件转换成翻页电子书。翻页电子书不仅方便阅读,而且还可以在手机上轻松翻页。那么如何将PDF文件转换成翻页电子书呢?今天就为大家介绍一个网站,可以帮助你轻松完成这个任务。 1.首先&am…

storm安装手册及笔记

图解Storm相关概念 图解storm的并发机制 安装Storm的步骤 1、安装一个zookeeper集群 2、上传storm的安装包,解压 3、修改配置文件storm.yaml #所使用的zookeeper集群主机 storm.zookeeper.servers: - "weekend05" - "weekend06"…

Linux网络编程03

select的缺陷 (1)fd,set的本质是一个位图,容量是固定的1024,因此最大只能监听1024个连接 (可以扩容) (2)监听和就绪用的是同一个数据结构,使用困难 (3&#x…

Zinx框架-游戏服务器开发003:架构搭建-需求分析及TCP通信方式的实现

文章目录 1 项目总体架构2 项目需求2.1 服务器职责2.2 消息的格式和定义 3 基于Tcp连接的通信方式3.1 通道层实现GameChannel类3.1.1 TcpChannel类3.1.2 Tcp工厂类3.1.3 创建主函数,添加Tcp的监听套接字3.1.4 代码测试 3.2 消息类的结构设计和实现3.2.1 消息的定义3…

java基础练习(使用java实现跨库数据调度ETL)

简介 本文写一篇关于java库与库之间的数据传输,现实生产中可能是通过其他方式完成,在没有架构的基础上使用java实现跨库的数据传送,非常不便利。但是作为练习我觉得确实非常有用,涉及的java知识点相对较多。本文以一个实列讲解&am…

C++相关练习及详细讲解

目录 题1:输出数组中第k小的数在数组内找出查找数字在该数组第一次出现的索引 题1:输出数组中第k小的数 题目描述: 给定一个数组arr 输出数组中第k小的数 如果不存在 输出-1 输入格式: 第一行输入一个数字n 代表数组arr大小 第二…

SpringBoot-WebSocket浏览器-服务器双向通信

文章目录 WebSocket 介绍入门案例 WebSocket 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 应用场景: 视…

UI设计感大型数据管理仪表盘后台模板源码

大型数据管理仪表盘后台模板是一款适合数据统计管理后台网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。 演示下载 qnziyw点cn/wysc/qdmb/20838点html

Solidity数据类型之函数类型

solidity中函数的形式 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]每个关键字的意思&#xff08;方括号里面的写不写都可以&#xff09; function&#xff1a; 声明函…

七月论文审稿GPT第2版:从Meta Nougat、GPT4审稿到Mistral、LongLora

前言 如此前这篇文章《学术论文GPT的源码解读与微调&#xff1a;从chatpaper、gpt_academic到七月论文审稿GPT》中的第三部分所述&#xff0c;对于论文的摘要/总结、对话、翻译、语法检查而言&#xff0c;市面上的学术论文GPT的效果虽暂未有多好&#xff0c;可至少还过得去&am…

基于java+springboot+vue的校园出入管理系统

项目介绍 本论文主要论述了如何使用JAVA语言开发一个校园出入管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述校园出入管理系统的当前背景以及系统开…

ArcGIS for Android 禁止地图旋转

ArcGIS for Android 禁止地图旋转 话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; public class LoadMap extends AppCompatActivity {// 地图private MapView mapView;private ArcGISMap map;Overrideprotected void onCreate(Bundle savedInstanceSta…

1.Netty概述

原生NIO存在的问题(Netty要解决的问题) 虽然JAVA NIO 和 JAVA AIO框架提供了多路复用IO/异步IO的支持&#xff0c;但是并没有提供给上层“信息格式”的良好封装。JAVA NIO 的 API 使用麻烦,需要熟练掌握 ByteBuffer、Channel、Selector等 , 所以用这些API实现一款真正的网络应…

逆向学习记录(4)adb

adb用于PC和手机端通讯。 常用命令如下&#xff1a; 如果不是模拟器&#xff08;模拟器一般都有自己的adb&#xff09;&#xff0c;adb会出现在Andirod的SDK中&#xff0c;路径为&#xff1a;Android/SDK/platform-tools。 最好加入环境变量中。

MTK联发科、高通、紫光展锐手机SOC平台型号汇总(含详细参数)

MediaTek联发科手机平台汇总&#xff1a; Qualcomm高通SOC平台汇总&#xff1a; 紫光展锐SOC平台汇总&#xff1a; 新移科技已成功研发手机SOC平台&#xff1a; 联发科平台&#xff1a; MTK6739、MTK6761、MTK6762、MTK6765、MTK8788、MTK6853、MTK6873、MTK6833、MTK6877、…

JVM 内存和 GC 算法

文章目录 内存布局直接内存执行引擎解释器JIT 即时编译器JIT 分类AOT 静态提前编译器&#xff08;Ahead Of Time Compiler&#xff09; GC什么是垃圾为什么要GC垃圾回收行为Java GC 主要关注的区域对象的 finalization 机制GC 相关算法引用计数算法&#xff08;Reference Count…

Proteus仿真--1602LCD显示仿手机键盘按键字符(仿真文件+程序)

本文主要介绍基于51单片机的1602LCD显示仿手机键盘按键字符&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中左下角12个按键模拟仿真手机键盘&#xff0c;使用方法同手机键一样&#xff0c;长按自动跳动切换键值&#xff0c;松手后确认选择&#xff…

JavaScript_Date对象_实例方法_get类

计算这一年还剩多少天&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document&…

《Pytorch新手入门》第二节-动手搭建神经网络

《Pytorch新手入门》第二节-动手搭建神经网络 一、神经网络介绍二、使用torch.nn搭建神经网络2.1 定义网络2.2 torch.autograd.Variable2.3 损失函数与反向传播2.4 优化器torch.optim 三、实战-实现图像分类(CIFAR-10数据集)3.1 CIFAR-10数据集加载与预处理3.2 定义网络结构3.3…