rxjs,仅在上一个操作完成后才在生成器上调用 next

rxjs, call next on generator only after previous operation completes

我正在通过使用 Blob.slice() in a generator 函数

创建文件切片来上传文件
export function* chunkFile(file: File, chunkSize: number) {
    let chunkStart = 0;
    const _chunkEnd = chunkStart + chunkSize;
    let chunkEnd = _chunkEnd > file.size ? file.size : _chunkEnd;
    while (chunkStart < file.size) {
        yield <ChunkType>{
            chunk: file.slice(chunkStart, chunkEnd),
            start: chunkStart,
            end: chunkEnd
        };
        chunkStart = chunkEnd;
        const _chunkEndIn = chunkStart + chunkSize;
        chunkEnd = _chunkEndIn > file.size ? file.size : _chunkEndIn;
    }
}

我正在上传这样的文件

Observable.from(chunckFile(file,chunkSize)).concatMap(uploadRoutine).subscribe();

但是所有区块都是同时创建的。

我需要的是仅当当前块上传完成时创建新块(在生成器上调用 next)。

自己找到解决方案

export function rxIterable<T, R>(source: Iterator<T>, consumer: (value: T) => Observable<R>) {
    const first = source.next();
    if (first.done) {
        return empty<R>();
    }
    return consumer(first.value).pipe(
        expand(() => {
            const next = source.next();
            if (next.done) {
                return empty<R>();
            }
            return consumer(next.value);
        }),
        finalize(() => source.return())
    );
}