【angular教程240111】08异步数据流编程与angular :promise,Rxjs6.x

【angular教程240111】08异步数据流编程与angular :promise,Rxjs6.x

目录标题

  • 一级目录
    • 二级目录
      • 三级目录
    • 〇、编程里的异步
    • 1异步编程常见的几种方法
    • 2 代码示例其中的一些方法:
      • 1. 回调函数(Callback Functions)
      • 2. 事件监听/发布订阅(Event Listeners / Pub-Sub)
      • 3. Promise
      • 4. RxJS
    • 一、Rxjs介绍
      • 1 使用RxJS的处理HTTP异步请求例子:
    • 二、Promise(async/await语法糖)和RxJS处理异步对比
    • 三、Rxjs unsubscribe取消订阅
    • 四、Rxjs订阅后多次执行
    • 五、Angualr6.x之前使用Rxjs的工具函数map filter
    • 六、Angualr6.x以后Rxjs6.x的变化以及使用
    • 七、Rxjs延迟执行
    • 八、Rxjs把Dom事件转化成流
    • 九、Rxjs--在angular组件中 进行学习
      • 1异步获取返回的数据--回调函数方法
      • 2 异步获取返回的数据--promise方法
      • 3异步获取返回的数据--rxjs
      • 4 撤销获取数据 Rxjs unsubscribe取消订阅
      • 5 Rxjs订阅后多次执行(持续获取异步的数据)
      • 6 Rxjs的工具函数map filter
        • 1 简单的例子解释 map 和 filter 操作符。
          • 1map
          • 2filter
        • 2 回到 Angular 中的 map 和 filter
          • 1 filter使用
          • 2 map使用
        • 3 filter & map结合使用

一级目录

二级目录

三级目录

异步与 Rxjs6.x异步数据流编程-Angular Rxjs快速入门
一、 Rxjs介绍
二、 Promise和RxJS 处理异步对比
三、 Rxjs unsubscribe取消订阅
四、 Rxjs 订阅后多次执行
五、 Angualr6.x之前使用Rxjs的工具函数map filter
六、 Angualr6.x 以后 Rxjs6.x的变化以及使用
七、 Rxjs延迟执行
八、 Rxjs把Dom事件转化成流

〇、编程里的异步

异步编程是一种编程范式,它允许程序在等待某个长时间运行的任务(如访问网络、文件系统操作、计时器等)完成时继续执行其他任务,而不是停下来等待任务完成。在JavaScript和Angular中,异步编程特别重要,因为它帮助避免阻塞UI渲染和用户交互,从而提高应用的响应性和性能。

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

  • 回调函数(Callbacks)
    最早的异步编程方法之一。
    可以导致回调地狱,代码难以阅读和维护。
  • 事件监听/发布订阅(Event Listeners / Pub-Sub)
    允许多个部分的代码响应事件。
    在Angular中,可以通过EventEmitter来实现组件间的通信。
  • Promise
    ES6引入的异步编程构造。
    允许附加.then()和.catch()方法来处理异步操作的成功或失败。
  • Async/Await
    ES2017引入的,建立在Promise之上的语法糖。
    允许以更同步的方式编写异步代码。
  • RxJS Observables
    RxJS是一个专门用于异步编程和事件的库。
    提供了强大的数据流控制能力,比如映射、过滤、合并等。
  • NgZone
    Angular的NgZone服务提供了一个执行上下文,能够自动为执行变更检测。
    通常在与Angular变更检测系统集成不良的第三方库中使用。
    异步编程在Angular中是由框架的变更检测机制和区域(Zone.js)自动管理的。这意味着当异步事件如HTTP响应到达时,Angular知道何时运行变更检测,以确保UI是最新的。

2 代码示例其中的一些方法:

1. 回调函数(Callback Functions)

这是最基础的异步编程技术。通过将一个函数(回调函数)作为参数传递给另一个函数,在特定的操作完成时执行。


function doAsyncTask(cb) {setTimeout(() => {console.log('Async Task Calling Callback');cb();}, 1000);
}doAsyncTask(() => console.log('Callback Called'));

2. 事件监听/发布订阅(Event Listeners / Pub-Sub)

这种模式允许订阅一个事件,并在事件发生时执行一些操作。在Angular中,可以使用EventEmitter和@Output装饰器来实现组件间(如上一章节的父子组件间)的事件通信。


import { Component, EventEmitter, Output } from '@angular/core';@Component({selector: 'app-event-emitter',template: '<button (click)="onClick()">Click me!</button>',
})
export class EventEmitterComponent {@Output() clicked = new EventEmitter<void>();onClick() {this.clicked.emit();}
}

3. Promise

Promise是ES6中引入的,用于表示一个异步操作的最终完成(或失败)及其结果值。


function doAsyncTask() {return new Promise((resolve, reject) => {setTimeout(() => {console.log('Async Task Complete');resolve();}, 1000);});
}doAsyncTask().then(() => console.log('Task Done!'));

4. RxJS

RxJS是Angular推荐的异步编程模型,它提供了一个强大的Observable类型。这是一个能够发射多个值的流,并且可以用各种强大的操作符来处理这些值。


import { of } from 'rxjs';
import { delay } from 'rxjs/operators';of('Hello World').pipe(delay(1000)).subscribe(console.log);

在Angular中,RxJS是处理事件和异步操作的首选方式,因为它提供了更高的灵活性、可组合性和强大的操作符集合,更适用于复杂的应用程序。它被广泛应用在Angular的HTTP服务、表单事件和状态管理等场景中。

一、Rxjs介绍

RxJS是Reactive Extensions For JavaScript的缩写,它提供了一种模型来处理时间序列上的事件。RxJS使用了Observables和一系列操作符来处理异步事件。

Angular的HttpClient服务返回的Observable对象是处理HTTP异步请求的例子。这些Observable可以被订阅,以在数据到达时更新UI。

1 使用RxJS的处理HTTP异步请求例子:


import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';export class MyService {constructor(private http: HttpClient) {}getData(): Observable<MyDataType> {return this.http.get<MyDataType>('/api/data');}
}

在组件中使用服务:


export class MyComponent implements OnInit {constructor(private myService: MyService) {}ngOnInit() {this.myService.getData().subscribe(data => {console.log(data);// 更新UI});}
}

这里,getData方法发起HTTP请求并返回Observable。组件订阅这个Observable,并在数据到达时响应。由于使用了HttpClient,Angular会自动处理变更检测,所以不需要手动触发。

二、Promise(async/await语法糖)和RxJS处理异步对比

Promise: 一次性的异步操作,无法取消,不支持重试。
RxJS: 可以被取消,支持重试、过滤、转换等,可以表示多个值。

“语法糖”(Syntactic Sugar)是一个编程术语,指的是在编程语言中添加的某种语法,这种语法对语言的功能并没有影响,但是可以使代码更易读、更易写。换句话说,语法糖就是让人们编写代码时更加方便的语法。

这种语法让开发者用更简洁、更清晰的代码来实现相同的功能,通常隐藏了一些实现的复杂性。语法糖让代码更接近自然语言,减少了编程的冗余,使得代码更加简洁。

例如,在JavaScript中,async/await 是一个常见的语法糖。它们让用同步的方式写出异步的代码,其背后实际上是基于Promise的。

不使用语法糖的代码示例(使用Promise):


function fetchData() {return getData() // 返回一个Promise.then(data => {return 'Done with data: ' + data;});
}

使用async/await语法糖的代码示例:


async function fetchData() {const data = await getData(); // 等待Promise解决return 'Done with data: ' + data;
}

在这个例子中,async/await 使得异步代码看起来和同步代码非常相似,从而使得代码更容易理解和维护。尽管async/await 看起来像是同步执行,但它们实际上还是异步的,它们只是让异步代码的书写和阅读变得更容易。

三、Rxjs unsubscribe取消订阅

取消订阅是RxJS中管理Observable订阅的过程,用来防止内存泄漏。


import { Subscription } from 'rxjs';const subscription: Subscription = observable.subscribe(value => console.log(value),error => console.error(error),() => console.log('Completed!')
);// 取消订阅
subscription.unsubscribe();

四、Rxjs订阅后多次执行

Observables可以发送多个值,并且可以订阅这些值。


import { Observable } from 'rxjs';const observable = new Observable(subscriber => {subscriber.next(1);subscriber.next(2);setTimeout(() => {subscriber.next(3);subscriber.complete();}, 1000);
});observable.subscribe(value => console.log(value));

五、Angualr6.x之前使用Rxjs的工具函数map filter


import { Observable } from 'rxjs';
import { map, filter } from 'rxjs/operators';const observable = new Observable((subscriber) => {subscriber.next(1);subscriber.next(2);subscriber.next(3);
}).pipe(filter((value) => value > 1),map(value => value * value)
);observable.subscribe(value => console.log(value));

六、Angualr6.x以后Rxjs6.x的变化以及使用

RxJS 6.x 有很大的变化,比如引入了管道(pipeable)操作符。


import { of } from 'rxjs';
import { map } from 'rxjs/operators';const source$ = of(1, 2, 3, 4, 5);
const result$ = source$.pipe(map(val => val * 10));
result$.subscribe(console.log);

七、Rxjs延迟执行

使用delay操作符可以延迟Observable发出的值。


import { of } from 'rxjs';
import { delay } from 'rxjs/operators';of('Hello World!').pipe(delay(1000)).subscribe(console.log);

八、Rxjs把Dom事件转化成流

RxJS可以把DOM事件转化为Observable流。


import { fromEvent } from 'rxjs';const button = document.querySelector('button');
const myObservable = fromEvent(button, 'click');
myObservable.subscribe(event => console.log(event));

以上是各个主题的简要介绍和代码示例。在实际的Angular应用程序中,会把这些代码片段整合到服务或组件中去管理数据流和事件。

九、Rxjs–在angular组件中 进行学习

1异步获取返回的数据–回调函数方法

异步‘
假设你想拿一个数据但是这个数据给到你需要时间,怎么让程序不会直接在还没拿到时候就报错或者跳过去

服务 request.service.ts

import { Injectable } from '@angular/core';
import { timeout } from 'rxjs';@Injectable({providedIn: 'root',
})
export class RequestService {constructor() {}// 执行顺序1  同步方法getData() {return '这是一个服务数据';}// 2 模拟异步方法//  1/*   getCallbackData() {// 执行顺序2setTimeout(() => {// 执行顺序4var data = '张三';return data;}, 1000);// 执行顺序3//会报错,因为 异步数据无法在外部直接获取  因此要写回调函数} */getCallbackData(cb: any) {/* ---------------cb回调函数 
home组件中     // (data: any) => {   console.log(calllbackData)  }整个回调函数 都做为 参数 
传给cd 然后 在本服务中 调用 */setTimeout(() => {var username = '张三';// return username;/* cd 即 function (data)=>{console.log(data);}*/cb(username);}, 1000);}
}

子组件 home上使用服务

import { Component, OnInit } from '@angular/core';
import { RequestService } from 'src/app/services/request.service';
@Component({selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.scss'],
})
export class HomeComponent implements OnInit {constructor(public myRequest: RequestService) {}ngOnInit() {//1同步方法let data = this.myRequest.getData();console.log(data);// 2异步方法----回调函数 /*  let calllbackData = this.myRequest.getCallbackData();console.log(calllbackData); //会报错undedined,因为 异步数据无法在外部直接获取  因此要写回调函数  (data:any)=>{} 在回调函数的方法体内 */let calllbackData = this.myRequest.getCallbackData((data: any) => {console.log(data);});// (data: any) => {   console.log(calllbackData)  }整个回调函数 都做为 参数 传给cd 然后 在服务中 调用}
}

2 异步获取返回的数据–promise方法

服务 request.service.ts

import { Component, OnInit } from '@angular/core';
import { RequestService } from 'src/app/services/request.service';
@Component({selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.scss'],
})
export class HomeComponent implements OnInit {constructor(public myRequest: RequestService) {}ngOnInit() {//1同步方法let data = this.myRequest.getData();console.log(data);// 2异步方法----回调函数/*  let calllbackData = this.myRequest.getCallbackData();console.log(calllbackData); //会报错undedined,因为 异步数据无法在外部直接获取  因此要写回调函数  (data:any)=>{} 在回调函数的方法体内 */let calllbackData = this.myRequest.getCallbackData((data: any) => {console.log(data);});// (data: any) => {   console.log(calllbackData)  }整个回调函数 都做为 参数 传给cd 然后 在服务中 调用//3  promise 获取异步数据var promiseData: any = this.myRequest.getPromiseData();promiseData.then((data: any) => {console.log(data);});}
}

子组件 home

import { Injectable } from '@angular/core';
import { timeout } from 'rxjs';@Injectable({providedIn: 'root',
})
export class RequestService {constructor() {}// 执行顺序1  同步方法getData() {return '这是一个服务数据';}// 2 模拟异步方法//  1/*   getCallbackData() {// 执行顺序2setTimeout(() => {// 执行顺序4var data = '张三';return data;}, 1000);// 执行顺序3//会报错,因为 异步数据无法在外部直接获取  因此要写回调函数} */getCallbackData(cb: any) {/* ---------------cb回调函数 
home组件中     // (data: any) => {   console.log(calllbackData)  }整个回调函数 都做为 参数 
传给cd 然后 在本服务中 调用 */setTimeout(() => {var username = '张三';// return username;cb(username);}, 1000);}getPromiseData() {/* ---------------不用cb回调函数 
home组件中     // (data: any) => {   console.log(calllbackData)  }整个回调函数 都做为 参数 
传给cd 然后 在本服务中 调用 */// promise()方法 并在里面传入一个function  () =>{ } 方法 ,() =>{ }方法里面有两个参数 resolve 和 rejecte 表示 成功和失败后的回调函数return new Promise((resolve, rejecte) => {setTimeout(() => {var username = '张三---promiise';//1同步return username;//2 回调函数 cb(username);//3resolve(username);}, 1000);});}
}
function resolve(username: string) {throw new Error('Function not implemented.');
}

3异步获取返回的数据–rxjs

服务 request.service.ts

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';@Injectable({providedIn: 'root',
})
export class RequestService {constructor() {}// 执行顺序1  同步方法getData() {return '这是一个服务数据';}// 2 模拟异步方法//  1/*   getCallbackData() {// 执行顺序2setTimeout(() => {// 执行顺序4var data = '张三';return data;}, 1000);// 执行顺序3//会报错,因为 异步数据无法在外部直接获取  因此要写回调函数} */getCallbackData(cb: any) {/* ---------------cb回调函数 
home组件中     // (data: any) => {   console.log(calllbackData)  }整个回调函数 都做为 参数 
传给cd 然后 在本服务中 调用 */setTimeout(() => {var username = '张三';// return username;cb(username);}, 1000);}getPromiseData() {/* ---------------不用cb回调函数 
home组件中     // (data: any) => {   console.log(calllbackData)  }整个回调函数 都做为 参数 
传给cd 然后 在本服务中 调用 */// promise()方法 并在里面传入一个function  () =>{ } 方法 ,() =>{ }方法里面有两个参数 resolve 和 rejecte 表示 成功和失败后的回调函数return new Promise((resolve, rejecte) => {setTimeout(() => {var username = '张三---promiise';//1同步return username;//2 回调函数 cb(username);//3 传入待处理的数据 usernameresolve(username);}, 3000);});}
// 4 getRxjsData() {/* 通过 Observable,来return返回一个处理的对象 ,
在 Observable的(   )内传入一个异步的方法 ( )=> , 
异步的方法 ( )=>  的( )内,来传参数,一般可以传入任意的参数,但此参数 一般叫observer ,处理异步的数据   */ return new Observable((observer) => {// setTimeout 一个定时器setTimeout(() => {var username = '张三---rxjs';// resolve(username);observer.next(username);// 观测到数据后,传入数据,待返回使用  这就封装好了一个异步的rxjs方法 // 然后再要使用的地方 subscribe订阅 就 }, 3000);});}
}

子组件home

import { Component, OnInit } from '@angular/core';
import { RequestService } from 'src/app/services/request.service';
@Component({selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.scss'],
})
export class HomeComponent implements OnInit {constructor(public myRequest: RequestService) {}ngOnInit() {//1同步方法let data = this.myRequest.getData();console.log(data);// 2异步方法----回调函数/*  let calllbackData = this.myRequest.getCallbackData();console.log(calllbackData); //会报错undedined,因为 异步数据无法在外部直接获取  因此要写回调函数  (data:any)=>{} 在回调函数的方法体内 */let calllbackData = this.myRequest.getCallbackData((data: any) => {console.log(data);});// (data: any) => {   console.log(calllbackData)  }整个回调函数 都做为 参数 传给cd 然后 在服务中 调用//3  promise 获取异步数据var promiseData: any = this.myRequest.getPromiseData();promiseData.then((data: any) => {console.log(data);});// 4 rxjs获取异步方法里面的返回的数据/*      要在外部获取  使用 封装好的 getRxjsData异步方法里面返回的数据,即 observable方法观察到的observer这个观察对象获取异步方法里面的返回的数据 ,返回的observable的这个对象的rxjsData的subscribe 的使用一个变量rajxData来接收然后使用 订阅 subscribe 里面的rxjs的来打印出来此数据  */
/* promise 与   rxjs对比 1  返回数据 ---promise 方法 resolve(username) rxjs里用 observe.next(username) 
2  获取异步方法里面的数据 ---promise 方法 promiseData.then rxjs用 rsjxData.subscribe(data)
3  rxjs更强大 */var rxjsData = this.myRequest.getRxjsData();rxjsData.subscribe((data) => {console.log(data);});}
}

4 撤销获取数据 Rxjs unsubscribe取消订阅

上述3 服务 request.service.ts中,异步方法rxjs的数据是设置的 3秒钟之后获得,
子组件home 在使用此rxjs时,可以设置定时器,通过判断数据获取的时间,来订阅、取消订阅。


import { Component, OnInit } from '@angular/core';
import { RequestService } from 'src/app/services/request.service';
@Component({selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.scss'],
})
export class HomeComponent implements OnInit {constructor(public myRequest: RequestService) {}ngOnInit() {//1同步方法let data = this.myRequest.getData();console.log(data);// 2异步方法----回调函数/*  let calllbackData = this.myRequest.getCallbackData();console.log(calllbackData); //会报错undedined,因为 异步数据无法在外部直接获取  因此要写回调函数  (data:any)=>{} 在回调函数的方法体内 */let calllbackData = this.myRequest.getCallbackData((data: any) => {console.log(data);});// (data: any) => {   console.log(calllbackData)  }整个回调函数 都做为 参数 传给cd 然后 在服务中 调用//3  promise 获取异步数据var promiseData: any = this.myRequest.getPromiseData();promiseData.then((data: any) => {console.log(data);});// 4 rxjs获取异步方法里面的返回的数据/*      要在外部获取  使用 封装好的 getRxjsData异步方法里面返回的数据,即 observable方法观察到的observer这个观察对象获取异步方法里面的返回的数据 ,返回的observable的这个对象的rxjsData的subscribe 的使用一个变量rajxData来接收然后使用 订阅 subscribe 里面的rxjs的来打印出来此数据  *//* promise 与   rxjs对比 1  返回数据 ---promise 方法 resolve(username) rxjs里用 observe.next(username) 
2  获取异步方法里面的数据 ---promise 方法 promiseData.then rxjs用 rsjxData.subscribe(data)
3  rxjs更强大 *//* 5 功能 测试,因此注释      // -var rxjsData = this.myRequest.getRxjsData();- // rxjsData.subscribe((data) => {- //   console.log(data);- // });代码   */// var rxjsData = this.myRequest.getRxjsData();// rxjsData.subscribe((data) => {//   console.log(data);// });// 5  外部调用时,设置中途撤回,如一秒钟未获得数据,就撤回刚才的操作var streem = this.myRequest.getRxjsData();// 把rxjs的obserable返回的对象 赋值给 stream 异步数据流var d = streem.subscribe((data) => {//  streem.subscribe(方法 来获取异步数据流里面的数据  (data) =>console.log(data);// 将数据 (data)进行处理 => { console.log(data); }); 此处是一个 console.log 控制台你打印 处理});//然后将返回的东西 赋值给一个变量 d  ,接下来通过一个定时器 timeout来设置超时取消setTimeout(() => {d.unsubscribe();// 1 取消订阅/* 注意语法错误:取消订阅的部分误写为 d.unsubscribe;这实际上并没有调用 unsubscribe 函数。正确的方式是 d.unsubscribe();。缺少括号意味着函数没有被调用,因此订阅没有被取消。*/}, 1000);// 一秒钟未获得数据,就撤回刚才的操作/*   // 2 设置 第四秒 意味着  订阅数据 // }, 4000); // 将时间设置为大于Observable发送数据的时间*/}
}

5 Rxjs订阅后多次执行(持续获取异步的数据)

request.service.ts服务内封装方法

  // 5 多次执行getRxjsIntervalData() {let count = 0;return new Observable<any>((observer) => {setInterval(() => {count++;var username = '张三--Rxjs-Interval' + count;observer.next(username);// observer.error('数据')}, 1000);});}

子组件 home使用

  // 这是一个同步方法ngOnInit(): void {// 6 多次执行// 这是一个同步方法//7、rxjs执行多次var streemInterval = this.myRequest.getRxjsIntervalData();streemInterval.subscribe((data: any) => {console.log(data);});**}

6 Rxjs的工具函数map filter

1 简单的例子解释 map 和 filter 操作符。
1map

假设有一个观察对象(Observable),它发出一系列数字,想对这些数字进行处理。

使用 map: 假设想将每个数字乘以 2。

import { of } from 'rxjs';
import { map } from 'rxjs/operators';// 创建一个发出数字 1, 2, 3 的 Observable
const numbers$ = of(1, 2, 3);// 使用 map 操作符将每个数字乘以 2
const doubledNumbers$ = numbers$.pipe(map(number => number * 2)
);// 订阅并打印结果
doubledNumbers$.subscribe(console.log); // 输出将是 2, 4, 6

这里,map(number => number * 2) 会将每个发出的值乘以 2。

2filter

使用 filter: 假设只对大于 1 的数字感兴趣。

import { of } from 'rxjs';
import { filter } from 'rxjs/operators';// 创建一个发出数字 1, 2, 3 的 Observable
const numbers$ = of(1, 2, 3);// 使用 filter 操作符选择大于 1 的数字
const filteredNumbers$ = numbers$.pipe(filter(number => number > 1)
);// 订阅并打印结果
filteredNumbers$.subscribe(console.log); // 输出将是 2, 3

在这个例子中,filter(number => number > 1) 只会通过那些大于 1 的值。

这些例子展示了如何使用 map 和 filter 操作符来转换和筛选 Observable 发出的值。通过这种方式,可以很方便地处理和操作异步数据流。

2 回到 Angular 中的 map 和 filter

服务
request.service.ts

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';@Injectable({providedIn: 'root',
})
export class RequestService {constructor() {}  getRxjsIntervalNum() {let count = 0;return new Observable<any>((observer) => {setInterval(() => {count++;observer.next(count);// observer.error('数据')}, 1000);});}}
1 filter使用

子组件ts


import { Component, OnInit } from '@angular/core';
import { RequestService } from 'src/app/services/request.service';
import { map, filter } from 'rxjs/operators';@Component({selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.scss'],
})
export class HomeComponent implements OnInit {constructor(public myRequest: RequestService) {}// 这是一个同步方法ngOnInit(): void {var streemNum = this.myRequest.getRxjsIntervalNum();streemNum.pipe(filter((value: any): any => {// filter(value:any)要指定类型,否则会报错if (value % 2 == 0) {return true;}})).subscribe((data: any) => {console.log(data);});}
}

控制台运行结果

[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.
core.mjs:26656 Angular is running in development mode.
home.component.ts:25 2
home.component.ts:25 4
home.component.ts:25 6
home.component.ts:25 8
home.component.ts:25 10
home.component.ts:25 12
home.component.ts:25 14
home.component.ts:25 16…
2 map使用

子组件home

import { Component, OnInit } from '@angular/core';
import { RequestService } from 'src/app/services/request.service';
import { map, filter } from 'rxjs/operators';@Component({selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.scss'],
})
export class HomeComponent implements OnInit {constructor(public myRequest: RequestService) {}// 这是一个同步方法ngOnInit(): void {// map var streemNum = this.myRequest.getRxjsIntervalNum();streemNum.pipe(map((value) => {return value * value;})).subscribe((data) => {console.log(data);});/* // filter var streemNum = this.myRequest.getRxjsIntervalNum();streemNum.pipe(filter((value: any): any => {// filter(value:any)要指定类型,否则会报错if (value % 2 == 0) {return true;}})).subscribe((data: any) => {console.log(data);});//  */}
}

控制台运行结果

[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.
core.mjs:26656 Angular is running in development mode.
home.component.ts:25 1
home.component.ts:25 4
home.component.ts:25 9
home.component.ts:25 16
home.component.ts:25 25
home.component.ts:25 36
。。。
3 filter & map结合使用

服务不变

子组件 filter & map结合使用

import { Component, OnInit } from '@angular/core';
import { RequestService } from 'src/app/services/request.service';
import { map, filter } from 'rxjs/operators';@Component({selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.scss'],
})
export class HomeComponent implements OnInit {constructor(public myRequest: RequestService) {}// 这是一个同步方法// 这是一个同步方法ngOnInit(): void {var streemNum = this.myRequest.getRxjsIntervalNum();streemNum.pipe(filter((value:any):any => {if (value % 2 == 0) {return true;}}),map((value) => {return value * value;})).subscribe((data) => {console.log(data);});}}

控制台运行结果

[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.
core.mjs:26656 Angular is running in development mode.
home.component.ts:28 4
home.component.ts:28 16
home.component.ts:28 36
home.component.ts:28 64
home.component.ts:28 100
home.component.ts:28 144
home.component.ts:28 196

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

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

相关文章

【工具栏】SequenceDiagram插件的使用(根据代码生成时序图)

1. 安装 2.使用 进入代码页面&#xff0c;点击鼠标右键 选择方法 根据方法中的代码生成时序图

2024年【山东省安全员C证】考试及山东省安全员C证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证考试是安全生产模拟考试一点通总题库中生成的一套山东省安全员C证复审考试&#xff0c;安全生产模拟考试一点通上山东省安全员C证作业手机同步练习。2024年【山东省安全员C证】考试及山东省安全员C证复…

docker部署私人云盘

目录 1.安装 2.登陆 1.安装 mkdir -p /opt/alist docker run -d --restartalways -v /opt/alist:/opt/alist/data -p 5244:5244 --name"alist" xhofe/alist:latest 2.登陆 ip:5224 默认账户admin 密码在日志中

test-04-test case generate 测试用例生成 tcases 快速开始

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 自动生成测试用例 入门指南 关于…

nodemon使用

为什么要使用 nodemon 在编写调试 Node.js 项目的时候&#xff0c;如果修改了项目的代码&#xff0c;则需要频繁的手动 close 掉&#xff0c;然后再重新启动&#xff0c;非常繁琐。 现在&#xff0c;我们可以使用 nodemon&#xff08;https://www.npmjs.com/package/nodemon&a…

js中关于字符串的创建和判断类型

文章目录 创建方法判断类型的技巧区分1、typeof2、instanceof 共点1、Object.prototype.toString.call2、库函数 参考链接&#xff1a;JS字符串的创建和常用方法 如何判断JS中一个变量是 string 类型 创建方法 字符串有着两种的创建方法&#xff0c;一个是使用构造函数&#x…

openssl3.2 - 官方demo学习 - server-arg.c

文章目录 openssl3.2 - 官方demo学习 - server-arg.c概述笔记备注END openssl3.2 - 官方demo学习 - server-arg.c 概述 TLS服务器, 等客户端来连接; 如果客户端断开了, 通过释放bio来释放客户端socket, 然后继续通过bio读来aceept. 笔记 对于开源工程, 不可能有作者那么熟悉…

力扣452. 用最少数量的箭引爆气球

排序 贪心 思路&#xff1a; 将数组元素按照右边界进行排序&#xff1b;第一支箭从第一个气球的右边界 pos 射出&#xff0c;如果下一个气球的左边界比 pos 要大&#xff0c;则这个气球不会被这支箭射中&#xff0c;否则会被射中&#xff08;因为排过序 pos ∈ [left, right]…

HCIA-Datacom题库(自己整理分类的)_09_Telnet协议【14道题】

一、单选 1.某公司网络管理员希望能够远程管理分支机构的网络设备&#xff0c;则下面哪个协议会被用到&#xff1f; RSTP CIDR Telnet VLSM 2.以下哪种远程登录方式最安全&#xff1f; Telnet Stelnet v100 Stelnet v2 Stelnet v1 解析&#xff1a; Telnet 明文传输…

中职组安全-win20230217-环境-解析

*任务说明&#xff1a; 仅能获取win20230217的IP地址 用户名&#xff1a;test&#xff0c;密码&#xff1a;123456 访问服务器主机,找到主机中管理员名称,将管理员名称作为Flag值提交&#xff1b; john 访问服务器主机,找到主机中补丁信息,将补丁编号作为Flag值提交&#xff…

【数字人】9、DiffTalk | 使用扩散模型基于 audio-driven+对应人物视频 合成说话头(CVPR2023)

论文&#xff1a;DiffTalk: Crafting Diffusion Models for Generalized Audio-Driven Portraits Animation 代码&#xff1a;https://sstzal.github.io/DiffTalk/ 出处&#xff1a;CVPR2023 特点&#xff1a;需要音频对应人物的视频来合成新的说话头视频&#xff0c;嘴部抖…

《Git学习笔记:Git入门 常用命令》

1. Git概述 1.1 什么是Git&#xff1f; Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛使用。 其它的版本控制工具 SVNCVSVSS 1.2 学完Git之后能做…

R语言【paleobioDB】——pbdb_intervals():通过参数选择,返回多个地层年代段的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_interval (id, ...) Arguments 参数【..…

顺序表的实现(上)(C语言)

本文章主要对顺序表的介绍以及数据结构的定义,以及几道相关例题,帮助大家更好理解顺序表. 文章目录 前言 一、顺序表的静态实现 二、顺序表的动态实现 三.定义打印顺序表函数 四.定义动态增加顺序表长度函数 五.创建顺序表并初始化 六.顺序表的按位查找 七.顺序表的按值…

【数值分析】区间折半法,matlab实现

区间折半法 从梯形公式出发&#xff0c;上一步步长为 h {h} h &#xff0c;则有步长折半后的积分 T 2 n 1 2 T n h 2 ∑ i 0 n − 1 f ( x i 0.5 ) T_{2n} \frac{1}{2}T_n \frac{h}{2} \sum_{i0}^{ n-1}f(x_{i0.5}) T2n​21​Tn​2h​i0∑n−1​f(xi0.5​) matlab实现 …

力扣 第 121 场双周赛 解题报告 | 珂学家 | 数位DP

前言 整体评价 T3, T4 都是典题 T1. 大于等于顺序前缀和的最小缺失整数 思路: 模拟 class Solution { public:int missingInteger(vector<int>& nums) {set<int> s(nums.begin(), nums.end());int acc nums[0];for (int i 1; i < nums.size(); i) {if …

Win10专业版系统搭建DNS解析服务

Win10专业版 纯新手&#xff0c;也没弄过Linux的。不喜勿喷&#xff0c;有问题请指出 第一天一头雾水整了几个小时没结果&#xff0c;第二天豁然开朗&#xff0c;10分钟明白了第一天的问题所在。 Win10 安卓&#xff1a; iOS&#xff1a; 搭建DNS服务器的意义&#xff1a; 屏蔽…

React Hooks useContext 传参数

1、封装 context.js 文件&#xff0c;如下图&#xff1a; import { createContext } from "react";const Context createContext(null);export default Context;2、父级组件引入 context.js 文件&#xff0c;并用Provider包裹子组件&#xff0c;值通过 value 传递&…

运算放大器相关知识总结(1)

1、 前言 最近做了一个小项目&#xff0c;这个项目是研发一款阻抗测量仪。这个阻抗测量仪可以测量人体在不同频率下的生物电阻抗&#xff0c;该设备的核心是模拟电路&#xff0c;技术难点是减小模拟电路噪声。该项目前前忙了2个多月&#xff0c;借着研发这个项目的机会把自己掌…

fmt中几个技法

最简状态机实现 struct {state current_state state::start;FMT_CONSTEXPR void operator()(state s, bool valid true) {if (current_state > s || !valid)throw_format_error("invalid format specifier");current_state s;} } enter_state;2336: ente…