繁体   English   中英

RxJS Node等待可观察对象完成,然后依次订购下一个

[英]RxJS Node wait for observable to complete before subscribing to the next in sequence

我正在尝试使用从Google工作表中抓取的值填充数据库。 hasuraHelper.insert()在我的数据库中进行HTTP发布。 我如何做到只有在上一个api调用返回后才能调用insert()? 我以为concatMap可以解决问题,但似乎它仍然急切地同意所有排放。

当前:请求1->请求2-> ...->请求1完成->请求2完成-> ...

我想要的是:请求1->请求1完成->请求2->请求2完成-> ...

以下是相关代码:

sheetsHelper.authToken()
    .flatMap(sheetsHelper.get)
    .flatMap(response => response.values) //values is a 2d array
    .map(row => {
        console.log(row[0]);
        const flights = [];
        //add 100-500 objects to this array
        return flights;
    })
    .flatMap(flights => {
        const arrayOfFlightArrays = [];
        //max batch size of 50
        while (flights.length) {
            const flightArr = flights.splice(0, 50);
            arrayOfFlightArrays.push(flightArr);
        }
        return Rx.Observable.from(arrayOfFlightArrays);
    })
    .concatMap(flights => hasuraHelper.insert(flights) //insert flights into table
        .retry()) 
    .map(response => response.data)
    .subscribe(console.log, console.error);

这是插入的样子:

exports.insert = function (objects) {
    return Rx.Observable.fromPromise(axios({
        method: 'post',
        url: '/',
        data: {
            type: "insert",
            args: {
                table: "flights",
                objects: objects
            }
        }
    }));
};

您的插入函数不是惰性的。 您正在将执行中的诺言包装在Observable中,但它已经在执行中。

为了保证在订阅时变得懒惰并开始处理,您需要将其包装在Rx.Observable.defer(() => Rx.Observable.fromPromise(axios(/* ... */))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM