angular - RxJS 队列调度器
问题描述
我的要求是每 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 就会被订阅。
基本上,创建一个你的 observables 列表,然后像这样连接它们:
concat(['111','2222','333'].map(item => this.rest.downloadPrope(item)))
这将一个接一个地下载三个资源。
推荐阅读
- ruby - 如何将数据从另一个 ruby 文件添加到一个 ruby 文件
- c++ - 为什么 &(arr+1) 无法编译
- javascript - 直接从成员函数访问成员变量时,为什么会出现 ReferenceError?
- python - 如何从另一个类中为一个类的对象设置动画?
- node.js - 无法从 FileSaver/Blob 与 Node 的 fs 获得相同的结果
- shell - 提取txt文件的最后一个重复部分
- c# - Typeahead.js 调用 ASP.Net 核心 API
- c++ - 如何在 GDI+ 中使用 stock-objects
- ios - 是否可以为 iOS、模拟器和 * 和 * Mac 创建一个胖框架?
- android - Firebase 数据库 getChildrenCount() Android