![](/img/trans.png)
[英]RxJS Observable - Wait for async method to complete before using next emitted value
[英]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.