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())
);
}
我正在通过使用 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())
);
}