我正在使用响应式ui,我遇到了一个问题,基本上在我的登录方法中,我想显示一个进度对话框,尝试登录,然后关闭对话框并返回最终结果。
这个问题的基本伪代码是这样的:private IObservable<bool> AttemptLogin(CredentialPair pair)
{
return Dialogs.ShowProgress("logging in", "doing stuff...")
.SelectMany(progressController => DoTheActualLogin(pair))
.Subscribe(boolForWhetherLoginSucceeded =>
{
});
}
ShowProgress
返回IObservable<ProgressController>
DoTheActualLogIn
返回IObservable<bool>
问题是,在执行登录后,我需要对进度控制器调用close方法。
我似乎不能想出一种方法来让控制器在序列中进一步下降。
我确信有一个组合子的序列,我错过了/做这样的事情的技术。
我想这就是你想要的:
(from progressController in Dialogs.ShowProgress("logging in", "doing stuff...")
from result in DoTheActualLogin(pair)
select new { result, progressController })
.Subscribe(anon => {...}, ex => {...})
Chris的回答很好,特别是如果您必须使用progressController进一步降低链。如果你只需要在登录后清理它,你可以这样做:
private IObservable<bool> AttemptLogin(CredentialPair pair)
{
return Dialogs.ShowProgress("logging in", "doing stuff...")
.SelectMany(progressController =>
DoTheActualLogin(pair).Finally(() => progressController.Close()))
.Subscribe(boolForWhetherLoginSucceeded =>
{
});
}