当我尝试绑定一个异步函数时,会陷入无限循环。
<tr *ngFor="let i of items">
<td>{{myAsyncFunc(i) | async}}</td>
</tr>
这是函数:
private myAsyncFunc(i: string): Promise<string> {
return Promise.resolve("some");
}
我做错了什么吗?还是这是一个错误?
每次调用myAsyncFunc(i: string)
时,您都会返回一个新的 Promise,这就是为什么会出现“无限循环”的原因。尝试返回相同的 Promise 实例 ;-)
“无限循环”实际上不是传统意义上的无限循环,而是async
管道触发其输入 Promise 解决时的变更检测周期的副作用。在这个新的变更检测周期中,Angular将调用myAsyncFunc(i: string)
并获取一个新的要观察的 Promise,然后解决整个问题再次开始。
@Pipe({
name: 'customPipe'
})
export class customPipe implements PipeTransform {
constructor(private someService: SomeService) {}
/**
*
* @param id
*/
transform(id: number): Observable<boolean> {
return this.someService.shouldShow(id);
}
}
在您的模板中,您可以这样调用异步管道:
<td>{{id | customPipe | async}}</td>
你可以查看我的博客文章,了解关于这个特定主题的内容,当它影响我们的项目并消耗了5GB的浏览器内存时 :)
链接在这里
最简单的解决方法是(如已经提到的)不要直接在模板中使用函数返回的Promise:{{ getPromise(id) | async }}
,而是将此Promise存储在控制器(.ts
文件)中,并在视图中引用它。
此外,可以通过将变更检测设置更改为push-pull
来解决此问题,但我认为这会带来更多的麻烦。