正常使用"/>
Rxjs bindNodeCallback无法与swithmap和flatmap一起正常使用
我正在尝试使用bindNodeCallback和fs readdir,stat读取文件。
这是我的代码:
import { readdir, stat, Stats } from "fs";
import { bindNodeCallback, Observable, of } from "rxjs";
import { catchError, filter, flatMap, map, mergeMap, switchMap, tap } from 'rxjs/operators';
const readDirBindCallback: (path: string) => Observable<string[]> = bindNodeCallback(readdir);
const fileStateBindCallback: (path: string) => Observable<Stats> = bindNodeCallback(stat);
readDirBindCallback('/Users/.../WebstormProjects/copy')
.pipe(
flatMap(x => x),
tap(console.log),
switchMap(status => {
console.log(status);
return fileStateBindCallback('/Users/.../WebstormProjects/copy/' + status);
})
)
.subscribe(result => {
console.log(result)
});
“ switchMap”已被正确调用多次。
问题是fileStateBindCallback仅被调用一次,最终的子记录仅被记录一次。
为什么会这样?如果我在switchMap块中手动订阅fileStateBindCallback。它会按我的预期运行。但这不是一个好习惯,也不适合我的要求。
回答如下:我认为问题是switchMap
运算符。
switchMap
一次只能观察一个活动的内部。如果一个外部值进入并且有一个活动的内部对象,它将被取消订阅,并且基于新到达的值和提供的功能到[ C0]。[switchMap
将返回一个readdir
。
array
将只发出数组的项目
separately
和synchronously。假设您的目录中有flatMap(arr => arr)
个项目。N
将一一发射这些项目。因此,将传递flatMap
,并且item 1
将创建一个内部obs(switchMap
),其中涉及异步操作。然后,发送fileStateBindCallback
,但由于这是同步发生的,将取消订阅由item 2
处理的当前内部可观察对象(由于[C0]而创建的一个内部对象),并将为item 1
创建一个新的内部可观察对象。
依此类推,直到switchMap
终于到来。请记住,数组的项目是同步发出的。 item 2
的内部Obs。将取消订阅,并为item N
创建一个新的。但是由于item N-1
是数组中的最后一项,所以它不能被任何后续的发射中断,这意味着它的内部可观察对象将有时间发射和完成。
您可能正在寻找的是item N
。
第N
个项目到达时,对于根据第concatMap
个项目创建的当前内部可观测对象,它将
wait
到complete,然后根据N
个项目。因此,用N-1
替换N
应该可以完成工作。如果顺序不重要,则可以选择switchMap
。
更多推荐
Rxjs bindNodeCallback无法与swithmap和flatmap一起正常使用
发布评论