Angular 保姆级别教程高阶应用 - RxJs

RxJS

13.1.1 什么是 RxJS ?

RxJS 是一个用于处理异步编程的 JavaScript 库,目标是使编写异步和基于回调的代码更容易。

13.1.2 为什么要学习 RxJS ?

就像 Angular 深度集成 TypeScript 一样,Angular 也深度集成了 RxJS。

服务、表单、事件、全局状态管理、异步请求 …

13.1.3 快速入门
  1. 可观察对象 ( Observable ) :类比 Promise 对象,内部可以用于执行异步代码,通过调用内部提供的方法将异步代码执行的结果传递到可观察对象外部。

  2. 观察者 ( Observer ):类比 then 方法中的回调函数,用于接收可观察对象中传递出来数据。

  3. 订阅 ( subscribe ):类比 then 方法,通过订阅将可观察对象和观察者连接起来,当可观察对象发出数据时,订阅者可以接收到数据。
    在这里插入图片描述

   import { Observable } from "rxjs"const observable = new Observable(function (observer) {setTimeout(function () {observer.next({name: "Tom"})}, 2000)})const observer = {next: function (value) {console.log(value)}}observable.subscribe(observer)
13.2 可观察对象
13.2.1 Observable
  1. 在 Observable 对象内部可以多次调用 next 方法向外发送数据。

    const observable = new Observable(function (observer) {let index = 0setInterval(function () {observer.next(index++)}, 1000)
    })const observer = {next: function (value) {console.log(value)}
    }observable.subscribe(observer)
    
  2. 当所有数据发送完成以后,可以调用 complete 方法终止数据发送。

    const observable = new Observable(function (observer) {let index = 0let timer = setInterval(function () {observer.next(index++)if (index === 3) {observer.complete()clearInterval(timer)}}, 1000)
    })const observer = {next: function (value) {console.log(value)},complete: function () {console.log("数据发送完成")}
    }observable.subscribe(observer)
    
  3. 当 Observable 内部逻辑发生错误时,可以调用 error 方法将失败信息发送给订阅者,Observable 终止。

    import { Observable } from "rxjs"const observable = new Observable(function (observer) {let index = 0let timer = setInterval(function () {observer.next(index++)if (index === 3) {observer.error("发生错误")clearInterval(timer)}}, 1000)
    })const observer = {next: function (value) {console.log(value)},error: function (error) {console.log(error)}
    }observable.subscribe(observer)
    
    1. 可观察对象是惰性的,只有被订阅后才会执行
    const observable = new Observable(function () {console.log("Hello RxJS")
    })
    // observable.subscribe()
    
  4. 可观察对象可以有 n 多订阅者,每次被订阅时都会得到执行
    在这里插入图片描述

    const observable = new Observable(function () {console.log("Hello RxJS")
    })observable.subscribe()
    observable.subscribe()
    observable.subscribe()
    observable.subscribe()
    observable.subscribe()
    
  5. 取消订阅

    import { interval } from "rxjs"const obs = interval(1000);
    const subscription = obs.subscribe(console.log);setTimeout(function () {subscription.unsubscribe()
    }, 2000)
    
    13.2.2 Subject
  6. 用于创建空的可观察对象,在订阅后不会立即执行,next 方法可以在可观察对象外部调用

    import { Subject } from "rxjs"const demoSubject = new Subject()demoSubject.subscribe({next: function (value) {console.log(value)}})
    demoSubject.subscribe({next: function (value) {console.log(value)}})setTimeout(function () {demoSubject.next("hahaha")
    }, 3000)
    
    13.2.3 BehaviorSubject

拥有 Subject 全部功能,但是在创建 Obervable 对象时可以传入默认值,观察者订阅后可以直接拿到默认值。

import { BehaviorSubject } from "rxjs"const demoBehavior = new BehaviorSubject("默认值")
demoBehavior.subscribe({next: function (value) {console.log(value)}})
demoBehavior.next("Hello")
13.2.3 ReplaySubject

功能类似 Subject,但有新订阅者时两者处理方式不同,Subject 不会广播历史结果,而 ReplaySubject 会广播所有历史结果。

import { ReplaySubject } from "rxjs"const rSubject = new ReplaySubject()rSubject.subscribe(value => {console.log(value)
})rSubject.next("Hello 1")
rSubject.next("Hello 2")setTimeout(function () {rSubject.subscribe({next: function (value) {console.log(value)}})
}, 3000)
13.3 辅助方法
13.3.1 range

range(start, length),调用方法后返回 observable 对象,被订阅后会发出指定范围的数值。
在这里插入图片描述

import { range } from "rxjs"range(0, 5).subscribe(n => console.log(n))// 0
// 1
// 2
// 3
// 4

方法内部并不是一次发出 length 个数值,而是发送了 length 次,每次发送一个数值,就是说内部调用了 length 次 next 方法。

13.3.2 of

将参数列表作为数据流返回。

在这里插入图片描述

of("a", "b", [], {}, true, 20).subscribe(v => console.log(v))
13.3.3 from

在这里插入图片描述

将 Array,Promise, Iterator 转换为 observable 对象。

from(["a", "b", "c"]).subscribe(v => console.log(v))
// a
// b
// c
import { from } from "rxjs"function p() {return new Promise(function (resolve) {resolve([100, 200])})
}from(p()).subscribe(v => console.log(v))
// [100, 200]
13.3.4 interval、timer

Interval:每隔一段时间发出一个数值,数值递增
在这里插入图片描述

import { interval } from "rxjs"interval(1000).subscribe(n => console.log(n))

**timer **:间隔时间过去以后发出数值,行为终止,或间隔时间发出数值后,继续按第二个参数的时间间隔继续发出值
在这里插入图片描述

import { timer } from "rxjs"timer(2000).subscribe(n => console.log(n))
timer(0, 1000).subscribe(n => console.log(n))
13.3.5 Concat

合并数据流,先让第一个数据流发出值,结束后再让第二个数据流发出值,进行整体合并。
在这里插入图片描述

import { concat, range } from "rxjs"concat(range(1, 5), range(6, 5)).subscribe(console.log)
13.3.7 combineLatest

将两个 Obserable 中最新发出的数据流进行组合成新的数据流,以数组的形式发出。和当前最新的进行组合。
在这里插入图片描述

import { combineLatest, timer } from "rxjs"const firstTimer = timer(0, 1000) // emit 0, 1, 2... after every second, starting from now
const secondTimer = timer(500, 1000) // emit 0, 1, 2... after every second, starting 0,5s from now
combineLatest(firstTimer, secondTimer).subscribe(console.log)// [0, 0] after 0.5s
// [1, 0] after 1s
// [1, 1] after 1.5s
// [2, 1] after 2s
13.3.8 zip

将多个 Observable 中的数据流进行组合。和将来最新的进行组合。

import { zip, of } from "rxjs"
import { map } from "rxjs/operators"let age = of(27, 25, 29)
let name = of("Foo", "Bar", "Beer")
let isDev = of(true, true, false)zip(name, age, isDev).pipe(map(([name, age, isDev]) => ({ name, age, isDev }))).subscribe(console.log)// { name: 'Foo', age: 27, isDev: true }
// { name: 'Bar', age: 25, isDev: true }
// { name: 'Beer', age: 29, isDev: false }
13.3.9 forkJoin

forkJoin 是 Rx 版本的 Promise.all(),即表示等到所有的 Observable 都完成后,才一次性返回值。
在这里插入图片描述

import axios from "axios"
import { forkJoin, from } from "rxjs"axios.interceptors.response.use(response => response.data)forkJoin({goods: from(axios.get("http://localhost:3005/goods")),category: from(axios.get("http://localhost:3005/category"))
}).subscribe(console.log)
13.3.10 throwError

返回可观察对象并向订阅者抛出错误。

在这里插入图片描述

import { throwError } from "rxjs"throwError("发生了未知错误").subscribe({ error: console.log })
13.3.11 retry

如果 Observable 对象抛出错误,则该辅助方法会重新订阅 Observable 以获取数据流,参数为重新订阅次数。

import { interval, of, throwError } from "rxjs"
import { mergeMap, retry } from "rxjs/operators"interval(1000).pipe(mergeMap(val => {if (val > 2) {return throwError("Error!")}return of(val)}),retry(2)).subscribe({next: console.log,error: console.log})
13.3.12 race

接收并同时执行多个可观察对象,只将最快发出的数据流传递给订阅者。

import { race, timer } from "rxjs"
import { mapTo } from "rxjs/operators"const obs1 = timer(1000).pipe(mapTo("fast one"))
const obs2 = timer(3000).pipe(mapTo("medium one"))
const obs3 = timer(5000).pipe(mapTo("slow one"))race(obs3, obs1, obs2).subscribe(console.log)
13.3.13 fromEvent

将事件转换为 Observable。

import { fromEvent } from "rxjs"const btn = document.getElementById("btn")
// 可以将 Observer 简写成一个函数,表示 next
fromEvent(btn, "click").subscribe(e => console.log(e))
13.4 操作符
  1. 数据流:从可观察对象内部输出的数据就是数据流,可观察对象内部可以向外部源源不断的输出数据。
  2. 操作符:用于操作数据流,可以对象数据流进行转换,过滤等等操作。
13.4.1 map、mapTo

**map:**对数据流进行转换,基于原有值进行转换。

在这里插入图片描述

import { interval } from "rxjs"
import { map } from "rxjs/operators"interval(1000).pipe(map(n => n * 2)).subscribe(n => console.log(n))

**mapTo:**对数据流进行转换,不关心原有值,可以直接传入要转换后的值。

在这里插入图片描述

import { interval } from "rxjs"
import { mapTo } from "rxjs/operators"interval(1000).pipe(mapTo({ msg: "接收到了数据流" })).subscribe(msg => console.log(msg))
13.4.2 filter

对数据流进行过滤。

import { range } from "rxjs"
import { filter } from "rxjs/operators"range(1, 10).pipe(filter(n => n % 2 === 0)).subscribe(even => console.log(even))
13.4.3 pluck

获取数据流对象中的属性值。
在这里插入图片描述

import { interval } from "rxjs"
import { pluck, mapTo } from "rxjs/operators"interval(1000).pipe(mapTo({ name: "张三", a: { b: "c" } }), pluck("a", "b")).subscribe(n => console.log(n))
13.4.4 first

获取数据流中的第一个值或者查找数据流中第一个符合条件的值,类似数组中的 find 方法。获取到值以后终止行为。

在这里插入图片描述

import { interval } from "rxjs"
import { first } from "rxjs/operators"interval(1000).pipe(first()).subscribe(n => console.log(n))interval(1000).pipe(first(n => n === 3)).subscribe(n => console.log(n))
13.4.5 startWith

创建一个新的 observable 对象并将参数值发送出去,然后再发送源 observable 对象发出的值。

在异步编程中提供默认值的时候非常有用。

在这里插入图片描述

import { interval } from "rxjs"
import { map, startWith } from "rxjs/operators"interval(1000).pipe(map(n => n + 100),startWith(505)).subscribe(n => console.log(n))
// 505
// 100
// 101
// 102
// ...
13.4.6 every

查看数据流中的每个值是否都符合条件,返回布尔值。类似数组中的 every 方法。
在这里插入图片描述

import { range } from "rxjs"
import { every, map } from "rxjs/operators"range(1, 9).pipe(map(n => n * 2),every(n => n % 2 === 0)).subscribe(b => console.log(b))
13.4.7 delay、delayWhen

**delay:**对上一环节的操作整体进行延迟,只执行一次。

import { from } from "rxjs"
import { delay, map, tap } from "rxjs/operators"from([1, 2, 3]).pipe(delay(1000),tap(n => console.log("已经延迟 1s", n)),map(n => n * 2),delay(1000),tap(() => console.log("又延迟了 1s"))).subscribe(console.log)// tap 操作符不会对数据流造成影响, 它被用来执行简单的副作用, 比如输出, 但是复杂的副作用不要在这执行, 比如 Ajax

**delayWhen:**对上一环节的操作进行延迟,上一环节发出多少数据流,传入的回调函数就会执行多次。

import { range, timer } from "rxjs"
import { delayWhen } from "rxjs/operators"range(1, 10).pipe(delayWhen(n => {console.log(n)return timer(n * 1000)})).subscribe(console.log)
13.4.8 take、takeWhile、takeUtil

take:获取数据流中的前几个
在这里插入图片描述

import { range } from "rxjs"
import { take } from "rxjs/operators"range(1, 10).pipe(take(5)).subscribe(console.log)

**takeWhile:**根据条件从数据源前面开始获取。

在这里插入图片描述

import { range } from "rxjs"
import { takeWhile } from "rxjs/operators"range(1, 10).pipe(takeWhile(n => n < 8)).subscribe(console.log)

**takeUntil:**接收可观察对象,当可观察对象发出值时,终止主数据源。
在这里插入图片描述

import { interval, timer } from "rxjs"
import { takeUntil } from "rxjs/operators"interval(100).pipe(takeUntil(timer(2000))).subscribe(console.log)
// 结果少两个数据流的原因:第一次和最后一次,都需要延迟 100 毫秒。
13.4.9 skip、skipWhile、skipUntil

**skip:**跳过前几个数据流。

在这里插入图片描述

import { range } from "rxjs"
import { skip } from "rxjs/operators"range(1, 10).pipe(skip(5)).subscribe(console.log)

**skipWhile:**根据条件进行数据流的跳过。

在这里插入图片描述

import { range } from "rxjs"
import { skipWhile } from "rxjs/operators"range(1, 10).pipe(skipWhile(n => n < 5)).subscribe(console.log)

**skipUntil:**跳过数据源中前多少时间发出的数据流,发送从这个时间以后数据源中发送的数据流。

import { timer, interval } from "rxjs"
import { skipUntil } from "rxjs/operators"interval(100).pipe(skipUntil(timer(2000))).subscribe(console.log)
13.4.10 last

获取数据流中的最后一个。

在这里插入图片描述

import { range } from "rxjs"
import { last } from "rxjs/operators"range(1, 10).pipe(last()).subscribe(console.log)

如果数据源不变成完成状态,则没有最后一个。

import { interval } from "rxjs"
import { last, take } from "rxjs/operators"interval(1000).pipe(take(5), last()).subscribe(console.log)
13.4.11 concatAll、concatMap

**concatAll:**有时 Observable 发出的又是一个 Obervable,concatAll 的作用就是将新的可观察对象和数据源进行合并。

Observable => [1, 2, 3]

Observable => [Observable, Observable]

在这里插入图片描述

import { fromEvent, interval } from "rxjs"
import { map, take, concatAll } from "rxjs/operators"fromEvent(document, "click").pipe(map(event => interval(1000).pipe(take(2))),concatAll()).subscribe(console.log)
import { map, concatAll } from "rxjs/operators"
import { of, interval } from "rxjs"interval(1000).pipe(map(val => of(val + 10)),concatAll()).subscribe(console.log)

**concatMap:**合并可观察对象并处理其发出的数据流。
在这里插入图片描述

13.4.13 reduce、scan

reduce: 类似 JavaScript 数组中的 reduce,对数数据进行累计操作。reduce 会等待数据源中的数据流发送完成后再执行,执行时 reduce 内部遍历每一个数据流进行累计操作,操作完成得到结果将结果作为数据流发出。

在这里插入图片描述

import { interval } from "rxjs"
import { take, reduce } from "rxjs/operators"interval(500).pipe(take(5),reduce((acc, value) => acc += value, 0)).subscribe(v => console.log())

scan:类似 reduce,进行累计操作,但执行时机不同,数据源每次发出数据流 scan 都会执行。reduce 是发送出最终计算的结果,而 scan 是发出每次计算的结果。

在这里插入图片描述

import { interval } from "rxjs"
import { take, scan } from "rxjs/operators"interval(500).pipe(take(5),scan((acc, value) => acc += value, 0)).subscribe(v => console.log())
13.4.14 mergeAll、mergeMap

**mergeAll:**交叉合并可观察对象。

在这里插入图片描述

import { fromEvent, interval } from "rxjs"
import { map, mergeAll } from "rxjs/operators"fromEvent(document, "click").pipe(map(() => interval(1000)),mergeAll()).subscribe(console.log)

mergeMap:交叉合并可观察对象以后对可观察对象发出的数据流进行转换。

import { of, interval } from "rxjs"
import { mergeMap, map } from "rxjs/operators"of("a", "b", "c").pipe(mergeMap(x => interval(1000).pipe(map(i => x + i)))).subscribe(x => console.log(x))
13.4.15 throttleTime

节流,可观察对象高频次向外部发出数据流,通过 throttleTime 限制在规定时间内每次只向订阅者传递一次数据流。
在这里插入图片描述

import { fromEvent } from "rxjs"
import { throttleTime } from "rxjs/operators"fromEvent(document, "click").pipe(throttleTime(2000)).subscribe(x => console.log(x))
13.4.16 debounceTime

防抖,触发高频事件,只响应最后一次。

在这里插入图片描述

import { fromEvent } from "rxjs"
import { debounceTime } from "rxjs/operators"fromEvent(document, "click").pipe(debounceTime(1000)).subscribe(x => console.log(x))
13.4.17 distinctUntilChanged

检测数据源当前发出的数据流是否和上次发出的相同,如相同,跳过,不相同,发出。

import { of } from "rxjs"
import { distinctUntilChanged } from "rxjs/operators"of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4).pipe(distinctUntilChanged()).subscribe(x => console.log(x)) // 1, 2, 1, 2, 3, 4
13.4.18 groupBy

对数据流进行分组。

import { of } from "rxjs"
import { mergeMap, groupBy, toArray } from "rxjs/operators"of({ name: "Sue", age: 25 },{ name: "Joe", age: 30 },{ name: "Frank", age: 25 },{ name: "Sarah", age: 35 }
).pipe(groupBy(person => person.age),mergeMap(group => group.pipe(toArray()))).subscribe(console.log)// [{name: "Sue", age: 25}, { name: "Frank", age: 25 }]
// [{ name: "Joe", age: 30 }]
// [{ name: "Sarah", age: 35 }]
13.4.19 withLatestFrom

主数据源发出的数据流总是和支数据源中的最新数据流进行结合,返回数组。

在这里插入图片描述

import { fromEvent, interval } from "rxjs"
import { withLatestFrom } from "rxjs/operators"const clicks = fromEvent(document, "click")
const timer = interval(1000)
clicks.pipe(withLatestFrom(timer)).subscribe(console.log)
13.4.20 switchMap

切换可观察对象。

import { fromEvent, interval } from "rxjs"
import { switchMap } from "rxjs/operators"fromEvent(document, "click").pipe(switchMap(ev => interval(1000))).subscribe(x => console.log(x))
13.5 练习
13.5.1 元素拖拽
<style>#box {width: 200px;height: 200px;background: skyblue;position: absolute;left: 0;top: 0;}
</style>
<div id="box"></div>
// 原生 JavaScript
box.onmousedown = function (event) {let distanceX = event.clientX - event.target.offsetLeftlet distanceY = event.clientY - event.target.offsetTopdocument.onmousemove = function (event) {let positionX = event.clientX - distanceXlet positionY = event.clientY - distanceYbox.style.left = positionX + "px"box.style.top = positionY + "px"}box.onmouseup = function () {document.onmousemove = null}
}
// RxJS
import { fromEvent } from "rxjs"
import { map, switchMap, takeUntil } from "rxjs/operators"const box = document.getElementById("box")fromEvent(box, "mousedown").pipe(map(event => ({distanceX: event.clientX - event.target.offsetLeft,distanceY: event.clientY - event.target.offsetTop})),switchMap(({ distanceX, distanceY }) =>fromEvent(document, "mousemove").pipe(map(event => ({positionX: event.clientX - distanceX,positionY: event.clientY - distanceY})),takeUntil(fromEvent(document, "mouseup"))))).subscribe(({ positionX, positionY }) => {box.style.left = positionX + "px"box.style.top = positionY + "px"})
13.5.2 搜索
<input id="search" type="text" placeholder="请输入搜索内容..." />
import { fromEvent, from, throwError } from "rxjs"
import { debounceTime, distinctUntilChanged, map, switchMap, catchError } from "rxjs/operators"
import axios from "axios"const search = document.getElementById("search")fromEvent(search, "keyup").pipe(debounceTime(700),map(event => event.target.value),distinctUntilChanged(),switchMap(keyword =>from(axios.get(`https://j1sonplaceholder.typicode.com/posts?q=${keyword}`)).pipe(map(response => response.data),catchError(error => throwError(`发生了错误: ${error.message}`))))).subscribe({next: value => {console.log(value)},error: error => {console.log(error)}})
13.5.3 串联请求

先获取token,再根据token获取用户信息

<button id="btn">获取用户信息</button>
import axios from "axios"
import { from, fromEvent } from "rxjs"
import { pluck, concatMap } from "rxjs/operators"const button = document.getElementById("btn")fromEvent(button, "click").pipe(concatMap(event =>from(axios.get("http://localhost:3005/token")).pipe(pluck("data", "token"))),concatMap(token =>from(axios.get("http://localhost:3005/userInfo")).pipe(pluck("data")))).subscribe(console.log)

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

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

相关文章

Qt 文本文件读写与保存

Qt 文本文件读写与保存 开发工具&#xff1a;VS2013 QT5.8 设计UI界面&#xff0c;如下图所示 sample7_1QFile.h 头文件&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample7_1QFile.h"class sample7_1QFile : public QMainWin…

1024玩码神挑战赛,太太太上头了!!!

闯关链接&#xff1a;编程导航-码神挑战 第1关 提示&#xff1a; 直接转ASKII码 第2关 提示&#xff1a; 最常用的快捷键&#xff08;cv&#xff09; 第3关 提示&#xff1a; 答案在网址栏 第4关 提示&#xff1a; 输入表示蓝色区域的这种颜色的16进制代码&#xff0c;在网页代…

【openAI】机器学习算法

文章目录 CSDN 前言 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&…

SQL实战测试

SQL实战测试 &#xff08;请写下 SQL 查询语句&#xff0c;不需要展示结果&#xff09; 表 a DateSalesCustomerRevenue2019/1/1张三A102019/1/5张三A18 1. **用一条 ** SQL 语句写出每个月&#xff0c;每个销售有多少个客户收入多少 输出结果表头为“月”&#xff0c;“销…

i春秋web题库——题目名称:SQLi

WEB——SQLi 写在之前&#xff1a;题目简介&#xff1a;题目分析&#xff1a; 写在之前&#xff1a; 本题在CSDN上或是其它博客上有过解答&#xff0c;只不过不知是什么原因&#xff0c;我没有找到解题过程比较完整的文章。于是我决定在CTF初学阶段写一篇这样的博客&#xff0…

【lca,树上差分】P3128 [USACO15DEC] Max Flow P

题意 给定大小为 n ( 2 ≤ n ≤ 5 1 0 4 ) n(2 \leq n \leq 5 \times 10^4) n(2≤n≤5104) 的树&#xff0c;并给定 m ( 1 ≤ m ≤ 1 0 5 ) m(1 \leq m \leq 10^5) m(1≤m≤105) 条树上的路径&#xff08;给定两个端点&#xff0c;容易证明两个点树上路径唯一&#xff09;&…

迭代器失效和支持随机访问的容器总结

创作活动 迭代器失效&#xff1a; 顺序容器&#xff08;如vector、deque、list&#xff09; vector 插入操作&#xff1a; 当在vector中间或头部插入元素时&#xff0c;所有位于插入点之后的迭代器都会失效。这是因为vector的元素在内存中是连续存储的&#xff0c;插入元素可能…

15.6 JDBC数据库编程6——可滚动和可更新的ResultSet

目录 15.6 引言 15.6.1 可滚动的ResultSet 15.6.1 可更新的ResultSet 15.6 引言 可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录&#xff0c;还可以向后访问结果集中记录。可更新的ResultSet是指不但可以访问结果集中的记录&#xff0c;还可以更新…

【深度学习代码调试5】标准化数据集:TensorFlow Datasets (TFDS)自动化数据加载与预处理

【标准化数据集】TensorFlow Datasets、TFDS&#xff1a;自动化数据加载与预处理 写在最前面1. 什么是 TensorFlow Datasets (TFDS)?主要特点&#xff1a; 2. TFDS 的核心 API&#xff1a;tfds.builder 和 download_and_preparetfds.builder&#xff1a;创建数据集构建器示例&…

【大数据学习 | Zookeeper】Zookeeper的选举机制

zookeeper的选举机制分为第一次启动和非第一次启动两种情况。 1. 选举机制 - > 第一次启动 (1)服务器1启动&#xff0c;发起一次选举。服务器1投自己一票。此时服务器1票数一票&#xff0c;不够半数以上(3票)&#xff0c;选举无法完成&#xff0c;服务器1状态保持为 LOOKIN…

STM32之EC800K 4G模块驱动

1.EC800K简介 EC800K&#xff0c;特别是EC800K-CN&#xff0c;是移远通信专为M2M&#xff08;机器对机器&#xff09;和IoT&#xff08;物联网&#xff09;领域而设计的超小尺寸LTE Cat 1无线通信模块。EC800K-CN作为一款专为M2M和IoT领域设计的LTE Cat 1无线通信模块&#xff…

w~视觉~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12320868 #xx1 基于mxnet的训练代码迁移到pytorch上和 在yolov5的代码基础上验证了一些目标检测的想法一起发了 在迁移mxnet训练代码的时候&#xff0c;很长一段时间结果都无法对齐&#xff0c;于是我不得不又重新认真的读…

Flutter Column组件实战案例

In this section, we’ll explore the Column widget, a fundamental tool for arranging widgets vertically in Flutter. We’ll dive into its functionality and guide you through using it effectively to create well-organized and visually appealing layouts. 在本节…

UE5 第一人称示例代码阅读0 UEnhancedInputComponent

UEnhancedInputComponent使用流程 我的总结示例分析firstthenand thenfinally&代码关于键盘输入XYZ 我的总结 这个东西是一个对输入进行控制的系统&#xff0c;看了一下第一人称例子里&#xff0c;算是看明白了&#xff0c;但是感觉这东西使用起来有点绕&#xff0c;特此梳…

语言模型微调:提升语言Agent性能的新方向

人工智能咨询培训老师叶梓 转载标明出处 大多数语言Agent依赖于少量样本提示技术&#xff08;few-shot prompting&#xff09;和现成的语言模型。这些模型在作为Agent使用时&#xff0c;如生成动作或自我评估&#xff0c;通常表现不佳&#xff0c;且鲁棒性差。 论文《FIREACT…

随机抽取学号

idea 配置 抽学号 浏览器 提交一个100 以内的整数。&#xff0c;后端接受后&#xff0c;根据提供的整数&#xff0c;产生 100 以内的 随机数&#xff0c;返回给浏览器&#xff1f; 前端&#xff1a;提供 随机数范围 &#xff0c;病发送请求后端&#xff1a;处理随机数的产生&…

【电机应用】变频器控制——变频水泵、变频空调

【电机应用】变频器控制——变频水泵、变频空调 文章目录 [TOC](文章目录) 前言一、变频器1、变频器的组成2、变频器的工作原理3、变频器常用算法 二、变频器的应用场景1、变频水泵2、变频空调 三、参考文献总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文…

Android 原生开发与Harmony原生开发浅析

Android系统 基于Linux ,架构如下 底层 (Linux )> Native ( C层) > FrameWork层 (SystemService) > 系统应用 (闹钟/日历等) 从Android发版1.0开始到现在15,经历了大大小小的变革 从Android6.0以下是个分水岭,6.0之前权限都是直接卸载Manifest中配置 6.0开始 则分普…

Matlab|基于氢储能的热电联供型微电网优化调度方法

目录 1 主要内容 模型求解流程 2 部分程序 3 程序结果 日前调度 日内调度 4 下载链接 1 主要内容 该程序复现《基于氢储能的热电联供型微电网优化调度方法》&#xff0c;针对质子交换膜燃料电池和电解槽的热电联供特性&#xff0c;为避免氢能系统的热能浪费并进一步提高…

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目&#xff0c;所以这里就结合一下&#xff0c;在搭建 k8s 集群后安装运维常用服务&#xff0c;比如 ansible 和 prometheus&#xff0c;用 NFS 实现数据存储同步&#xff0c…