angular 新的@async块

alen0pnh  于 7个月前  发布在  Angular
关注(0)|答案(6)|浏览(76)

与功能请求相关的@angular/*包有哪些?

core

描述

因为没有人回应我上一个功能请求的第二条评论,所以我打开了一个新的功能请求以获得关于它的意见和建议。
我还阅读了 blog post 关于可延迟视图的文章,尤其是最后部分 "展望未来",其中提到社区对将延迟与数据获取结合感兴趣。
我对这个非常感兴趣,所以这是我的想法:
一个新的 @async 块,其基本工作原理类似于异步管道,但具有额外的支持 @loading@error 块的功能。
要清楚地说明,这不会懒加载已使用的组件,而是会正常加载它们。为此目的,我一直在考虑为 @defer 块引入一个新的触发器:on fetch,但那可能是另一个功能请求的主题。

建议的解决方案

@async (entries; as results) {
  @for (entry of results; track entry.id) {
    <p>{{ entry.title }}</p>
  } @empty {
    <p>No entries</p>
  }
} @loading (minimum 200ms) {
  <p>Loading</p>
} @error {
  <p>Something went wrong</p>
}

考虑过的其他替代方案

#53185

lc8prwob

lc8prwob1#

你是否认为它是一种替代async pipe的方式,即它以可观察对象作为输入?如果是这样的话,@Loading会做什么?它似乎只对解决promise有意义,而不是可观察对象。

91zkwejq

91zkwejq2#

你是否认为它是一种替代async pipe的方法,即它接受observables作为输入?如果是这样的话,@Loading会做什么?它似乎只对解决promise有意义,而不是observables。
为什么?目前async pipe总是将| null添加到类型中,而async管道可以等待observable发出。但我实际上想用$completed扩展这个语法。
这来自NgRx Let pipe。一个区别是他们使用suspense术语而不是loading
当然,@async也可以与Promise 1:1地工作!
一个问题是,如果Angular开发人员不想切断模板与RxJs的联系,并引导人们更多地使用toSignal(),当然,如果信号被使用,那么我们就可以获得更细粒度的变化检测的好处!
所以最后,我认为@async看起来很好,但只适合坚持使用RxJs的人或希望在大型、难以移植的基于RxJs的仓库中获得更清晰的语法的人。

2ul0zpep

2ul0zpep3#

这个功能请求现在已经成为我们的待办事项候选!在接下来的阶段,社区有60天的时间进行投票。如果请求获得超过20票的赞成,我们将把它移到我们的考虑列表中。
你可以在我们的文档中找到更多关于功能请求流程的详细信息。

ua4mk5z4

ua4mk5z44#

这正是我所期待的,类似于SolidJS中的Suspense块,并暴露其他块,如@Loading、@error、@Placeholder(类似于@defer,但纯粹用于数据获取)。
绑定到此@async/@Suspense块的信号/Promise/Observable(很可能是信号)应暴露由数据获取抛出的错误对象,以便在错误块中显示相关的错误消息。

zyfwsgd6

zyfwsgd65#

你还需要考虑多次请求的数据。例如,如果用户更改了一些表单值,下载必须重新开始。这可以通过使用@async接受信号或线程来实现:

@async (entries(); let result = $result) {
  ...
}
@async ((entries$ | async); let result = $result) {
  ...
}
vi4fp9gy

vi4fp9gy6#

错误应该可以捕获。

相关问题