gpt4 book ai didi

parallel-processing - 具有并发 worker 的 RxJS 并行队列?

转载 作者:行者123 更新时间:2023-12-04 02:52:52 24 4
gpt4 key购买 nike

假设我想下载 10,000 个文件。我可以轻松地构建一个包含这 10,000 个文件的队列(如果其中任何一个可以做得更好,我很乐意听取建议),

import request from 'request-promise-native';
import {from} from 'rxjs';

let reqs = [];
for ( let i = 0; i < 10000; i++ ) {
reqs.push(
from(request(`http://bleh.com/${i}`))
)
};

现在我有一个 Rx.JS observable 数组,我是从代表我的队列的 promise 中创建的。现在对于我想要的行为,我想发出
  • 三并发请求服务器
  • 完成请求后,我希望触发新的请求。

  • 我可以为这个问题创建一个解决方案,但考虑到诸如 Rxjs queue 之类的事情,我从未使用过我想知道最正确的 Rxjs 方法是什么。

    最佳答案

    听起来你想要一个等效的 forkJoin支持调用者指定的最大并发订阅数。

    可以重新实现 forkJoin使用 mergeMap并揭露 concurrent参数,like this :

    import { from, Observable } from "rxjs";
    import { last, map, mergeMap, toArray } from "rxjs/operators";

    export function forkJoinConcurrent<T>(
    observables: Observable<T>[],
    concurrent: number
    ): Observable<T[]> {
    // Convert the array of observables to a higher-order observable:
    return from(observables).pipe(
    // Merge each of the observables in the higher-order observable
    // into a single stream:
    mergeMap((observable, observableIndex) => observable.pipe(
    // Like forkJoin, we're interested only in the last value:
    last(),
    // Combine the value with the index so that the stream of merged
    // values - which could be in any order - can be sorted to match
    // the order of the source observables:
    map(value => ({ index: observableIndex, value }))
    ), concurrent),
    // Convert the stream of last values to an array:
    toArray(),
    // Sort the array of value/index pairs by index - so the value
    // indices correspond to the source observable indices and then
    // map the pair to the value:
    map(pairs => pairs.sort((l, r) => l.index - r.index).map(pair => pair.value))
    );
    }

    关于parallel-processing - 具有并发 worker 的 RxJS 并行队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54245998/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com