通过可观察序列线程论证

Threading argument through observable sequence

我正在使用响应式 ui,但我 运行 遇到了一个问题,本质上是在我的登录方法中,我想显示一个进度对话框,尝试登录,然后关闭对话框return 最终结果。

问题的基本伪代码是这样的:

private IObservable<bool> AttemptLogin(CredentialPair pair)
{
    return Dialogs.ShowProgress("logging in", "doing stuff...")
        .SelectMany(progressController => DoTheActualLogin(pair))
        .Subscribe(boolForWhetherLoginSucceeded =>
        {

        });
}
  1. ShowProgress return 一个 IObservable<ProgressController>
  2. DoTheActualLogInreturn一个IObservable<bool>

问题是在执行登录后,我需要调用进度控制器的关闭方法。

我似乎想不出一种方法让控制器在序列中更进一步。

我确定有一个我遗漏的序列的组合器/做这样的事情的技术。

我想这就是你想要的:

(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 =>
        {

        });
}