首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步管道中的角2-环环

异步管道中的角2-环环
EN

Stack Overflow用户
提问于 2016-12-21 14:58:18
回答 4查看 8.3K关注 0票数 16

当我尝试像这样绑定异步函数时,我会得到一个没完没了的循环:

代码语言:javascript
运行
复制
<tr *ngFor="let i of items">
     <td>{{myAsyncFunc(i) | async}}</td>
</tr>

这是一项功能:

代码语言:javascript
运行
复制
private myAsyncFunc(i: string): Promise<string> {
        return Promise.resolve("some");
}

我做错什么了吗?还是这是个虫子?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-21 15:07:05

您将在每次调用中从myAsyncFunc(i: string)返回一个新的承诺,这就是为什么您会得到一个“无止境的循环”。尝试返回相同的诺言实例;-)

“无止境循环”实际上不是传统的无止境循环,而是async管道在其输入承诺解决时触发变化检测周期的副作用。在这个新的变化检测周期,角将调用myAsyncFunc(i: string),并得到一个新的承诺来观察,然后解决整个事件重新开始。

票数 24
EN

Stack Overflow用户

发布于 2018-08-30 14:29:23

如果异步/可观测性要求您传递一个参数(例如,您在ngFor循环中),那么您可以为此创建一个自定义异步管道。

代码语言:javascript
运行
复制
@Pipe({
  name: 'customPipe'
})
export class customPipe implements PipeTransform {

  constructor(private someService: SomeService) {}

  /**
   * 
   * @param id 
   */
  transform(id: number): Observable<boolean> {
    return this.someService.shouldShow(id);
  }

}

在模板中,您可以将异步管道调用为:

代码语言:javascript
运行
复制
<td>{{id | customPipe | async}}</td>
票数 4
EN

Stack Overflow用户

发布于 2021-07-19 14:41:51

解决办法是使用回忆录

您可以创建一个自定义装饰器,以便按照指示这里回溯您的函数。在此之后,您可以编写如下的函数:

代码语言:javascript
运行
复制
@memoize()    
private myAsyncFunc(i: string): Promise<string> {
        return Promise.resolve("some");
}

这会缓存最初返回的承诺,当async管道重新检查承诺的状态时,它将得到缓存的承诺,而不是新的承诺。

注意回传函数的缓存效果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41265716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档