何时在等待观察时关闭离子加载控制器

ido*_*osh 5 rxjs typescript ionic2 ionic3 angular

我想知道如何在等待异步可观察到达时正确使用离子-2加载控制器 - 因为可观察到的可能没有,单个或许多响应的"波".

第一个问题 - 如何呈现

我应该使用loader.present()loader.present().then(...我看到很多代码示例"忽略"加载器的异步性质(我甚至看到了loader.present(//function to execute)

第二个问题 - 什么时候解雇

如上所述,来自订阅的响应可以到达未知的响应"波浪" - 考虑到它,何时应该解除加载器?如果没有回复怎么办?如果有几个回复怎么办?例如:

let loader = this.loadingController.create({content : "something"})
loader.present().then(()=>{
    source.subscribe((school)=>{
        this.schools.push(school)
        loader.dismiss()
        }, err=> loader.dismiss()
    )
 })
Run Code Online (Sandbox Code Playgroud)

第三个问题 - 如何解雇

我注意到解决加载控制器有很多问题(例如,离子2 - 加载控制器不起作用).解雇后赶上是不够的??如果在加载后我想要推送到另一个页面怎么办...?

感谢您的耐心等待.

seb*_*ras 9

第一个问题 - 如何呈现?

呈现加载器的正确方法是使用then,因为否则您可能会面临与错误动画相关的一些问题,也可能出现其他一些奇怪的问题.毕竟,如果方法返回一个promise,那么使用它的正确方法总是在promise完成时做其他事情.

loader.present().then(() => { /* ... */ });
Run Code Online (Sandbox Code Playgroud)

当我需要解除加载时,我也会这样做:

loading.dismiss().then(() => { /* ... */ });
Run Code Online (Sandbox Code Playgroud)

第二个问题 - 什么时候解雇?

如果使用加载的想法是让用户知道背景中发生了某些事情,所以我认为你应该在第一波之后解除加载.

如果没有响应到达(例如结果为空),则可以包含一个*ngIf="result.items.length === 0"条件来显示div,并显示一条消息,指出结果为空.如果新波浪到达结果中的某些项目,则该div将自动隐藏.

第三个问题 - 如何解雇?

就像present方法一样,它dismiss也会返回一个promise.在这种情况下,如果您不使用动画,则更容易在动画中看到一些错误的行为then.所以再次,只需等待结束方法(通过使用then),您可以推送新页面或做您需要做的事情,它应该正常工作:

loading.dismiss().then(() => { this.navCtrl.push(NewPage); });
Run Code Online (Sandbox Code Playgroud)