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

时间:2018-02-16 07:27:10

标签: iterator generator rxjs5

我通过在Blob.slice()函数中使用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();

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

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

1 个答案:

答案 0 :(得分:2)

我自己找到解决方案

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())
    );
}