使用RxJS的队列功能

时间:2019-06-24 16:49:02

标签: rxjs rxjs-pipeable-operators

我在后端使用带有NodeJS的rxjs。 我有一个Rest API,它允许使用者运行远程纱线安装过程。 install函数返回该过程的可观察值。因此,成功安装模块后,它会发出可观察且完整的值。此时,Rest API将向用户返回一个响应,表明安装成功。如果安装失败,该过程将在流中抛出一个错误,Rest API返回另一个包含错误信息的响应。

我的问题是:

使用者多次并行调用该API,因此后端将进行并行安装。

我尝试使用油门运算符创建队列,但该队列使第一个流保持活动状态。因此,如果第一个进程“已完成”,则返回“ true”,但流未完成

export class MyService {
    // the function called by the REST API
    installGlobal(moduleName: string): Observable < boolean > {
        // I think, there are something to do here to make it queuing
        return this.run('yarn', ['global', 'add', moduleName]);
    }

    private run(cmd: string, args: string[]): Observable < boolean > {
        const cmd$ = fromPromise(spawn(cmd, args)).pipe(
            map(stdout => {
                this.logger.info(`Install Module Successfully`);
                this.logger.info(`stdout: ${stdout.toString()}`);
                return true;
            }),
            catchError(error => {
                const errorMessage: string = error.stderr.toString();
                return _throw(errorMessage.substr(errorMessage.indexOf(' ') + 1));
            })
        );
        return cmd$;
    }
} 

我的期望:

有多个请求,必须将它们排队。因此,第一个将被处理,并且所有并行一次必须排队。处理第一个流后,它必须将响应返回给API使用方(例如200个已完成),并从队列中恢复下一个流。

[2019年7月1日更新]:添加示例

您可以在stackblitz

处获取代码演示。

我已经重新实现了现有的代码,并且通过向将要调用队列的服务订购多个时间来模拟我的API调用

1 个答案:

答案 0 :(得分:0)

Rxjs中的简单queque可以如下完成

xNSht.ColumnWidth = 255