RxJS 队列调度器
RxJS Queue Scheduler
我的要求是每 10 秒,需要从后端获取数据并更新输入列表的属性。另外,请求应该一个一个地打到后端。我在网上搜索过,发现队列调度程序对此很有用。 (让我知道我的理解是否错误)。所以我创建了以下代码:
- 每 10 秒开始间隔
private initializeInterval() {
interval(10000).subscribe(x => {
this.queueItems();
});
}
- 正在创建队列调度程序:
private queueItems() {
let taskEntry: = ['111','2222','333']
console.log("Started adding item in queue");
taskEntry.forEach(item => {
queue.schedule(this.retrieveData.bind(this), 100, item);
})
console.log("Completed adding item in queue");
}
- 正在从后端检索数据
private async retrieveData(item) {
console.log("Starting");
let result = await this.rest.downloadPrope(item);
console.log(result)
console.log("Completed");
}
我的期望是 QueueScheduler 在完成上一个请求后调用 retrieveData...但是所有请求同时登陆到 retrieveData。
我的输出是:
开始在队列中添加项目
已完成在队列中添加项目
开始(3 次)(在完成之前,下一个请求从队列中降落)
开始在队列中添加项目
已完成在队列中添加项目
开始(3次)
完成(3次)
完成(3次)
你能告诉我这是什么问题吗?
队列调度程序不会等待您放入的任务的结果。
它只是将您交给它的任务推迟到 JavaScript 事件队列。你不能通过使用 async / await
.
让它顺序完成异步任务
您可能需要的是 concat
运算符。你给它一个订阅了 的 observables 列表一个接一个 。这意味着,一旦第一个 observable 完成,第二个 observable 将被订阅。
基本上,创建一个可观察对象列表,然后像这样连接它们:
concat(['111','2222','333'].map(item => this.rest.downloadPrope(item)))
这样会依次下载三个资源
我的要求是每 10 秒,需要从后端获取数据并更新输入列表的属性。另外,请求应该一个一个地打到后端。我在网上搜索过,发现队列调度程序对此很有用。 (让我知道我的理解是否错误)。所以我创建了以下代码:
- 每 10 秒开始间隔
private initializeInterval() {
interval(10000).subscribe(x => {
this.queueItems();
});
}
- 正在创建队列调度程序:
private queueItems() {
let taskEntry: = ['111','2222','333']
console.log("Started adding item in queue");
taskEntry.forEach(item => {
queue.schedule(this.retrieveData.bind(this), 100, item);
})
console.log("Completed adding item in queue");
}
- 正在从后端检索数据
private async retrieveData(item) {
console.log("Starting");
let result = await this.rest.downloadPrope(item);
console.log(result)
console.log("Completed");
}
我的期望是 QueueScheduler 在完成上一个请求后调用 retrieveData...但是所有请求同时登陆到 retrieveData。
我的输出是:
开始在队列中添加项目
已完成在队列中添加项目
开始(3 次)(在完成之前,下一个请求从队列中降落)
开始在队列中添加项目
已完成在队列中添加项目
开始(3次)
完成(3次)
完成(3次)
你能告诉我这是什么问题吗?
队列调度程序不会等待您放入的任务的结果。
它只是将您交给它的任务推迟到 JavaScript 事件队列。你不能通过使用 async / await
.
您可能需要的是 concat
运算符。你给它一个订阅了 的 observables 列表一个接一个 。这意味着,一旦第一个 observable 完成,第二个 observable 将被订阅。
基本上,创建一个可观察对象列表,然后像这样连接它们:
concat(['111','2222','333'].map(item => this.rest.downloadPrope(item)))
这样会依次下载三个资源