angular - 如何同步执行异步代码Angular 5
问题描述
我有一个迭代文件列表的函数,然后对于每个文件,它调用一个异步方法,该方法执行一些图像操作,然后将图像推送到一个数组。
问题是异步调用同时发生,因此它锁定了 UI。所以我想遍历列表,但只在前一个完成时调用该函数。
Array.from(files).forEach(data => {
if (data.size > 5000000) {
this.toastr_service.error('FILE ' + data.name + ' EXCEEDS FILE SIZE LIMIT (5MB)');
}else {
this.asyncFunc(data).subscribe(result => {
this._photos.push(result);
}, error => {
console.log(error);
});
}
});
解决方案
使用map
数组的功能以及 RxJS 的功能forkJoin
forkJoin(Array
.from(files)
.map(file => file.size < 5000000 && this.asyncFunc(file) || undefined)
.filter(value => !!value)
).subscribe(([...responses]) => {
console.log(responses);
this._photos.push(...responses);
});
forkJoin
将在文件大小低于 5Mb 的情况下进行所有调用(map
并filter
注意这一点),一旦进行了所有调用,响应将被推送到您的数组中。
编辑如果您希望对呼叫进行排序,请concat
改用:
concat(...Array
.from(files)
.map(file => file.size < 5000000 && this.asyncFunc(file) || undefined)
.filter(value => !!value)
).subscribe((...responses) => {
this._photos.push(...responses);
console.log(this.photos);
});
推荐阅读
- python - Tkinter画布问题,3天前开始编码
- python - 如何转换数据框
- wordpress - 在 wordpress 仪表板中找不到页面源代码
- hadoop-yarn - 在 EMR 中取消 YARN 步骤
- php - insertafter 数据卡在其上方的单元格中
- ruby-on-rails - ActiveRecord::SubclassNotFound:无效的单表继承类型:User::Admin 不是 User 的子类
- python - 我在 python 中的全局变量无法从它创建的 def 外部引用
- listview - 使用 List 在 cide 后面创建一个列表视图
- > 作为源和网格作为数据模板
- javascript - 如何根据屏幕大小调整输入的大小(由用户在弹出窗口中选择)
- sql - SQL 窗口函数 order by vs partition by。有什么区别?