【问题标题】:Async branch and sync branch meet using Angular Observable异步分支和同步分支使用 Angular Observable 相遇
【发布时间】:2018-02-10 19:30:22
【问题描述】:

假设我们有一个像这样的简单伪代码 sn-p:

if (myCondition){
  // Async branch
  myObservable
    .somethingAsync()
    .subscribe(x => {
      doSomething(x);
    });
} else {
  // Sync branch
  somethingSync();
}
continueBothHere();

所以,一个异步分支和一个同步分支,其中 continueBothHere() 总是在 if 语句之后执行。 假设 continueBothHere() 不需要来自任一分支的任何输入。

如何使用 Observables 实现这一点?

我想我想在 if 语句 before 定义一个 Observable,所以我可以在 if 语句 after 使用它来加入分支?但这可以与真正分支中的 observable 相结合吗?如果有的话,我对 false 分支中的那个 Observable 说什么?也许这可以在不使用 if 语句的情况下实现?


明确一点:在真正的分支中,我希望在执行 doSomething(x) 之后再执行 continueBothHere()

【问题讨论】:

    标签: javascript angular rxjs branch observable


    【解决方案1】:

    当我处理observable 时,我想将其包含到异步链或同步和异步操作中,这应该具有相同的后续步骤,我通常从new Promise 开始。这样,您可以轻松地使您的代码异步并处理 then 块内的数据:

    new Promise (resolve => {
      if (myCondition){
        // Async branch
        myObservable
          .somethingAsync()
          .take(1)
          .subscribe(x => {
            resolve(doSomething(x));
          });
      } else {
        // Sync branch
        resolve(somethingSync());
      }
    })
    .then(data => {
      // "data" will contain the result of "doSomething(x)" or "somethingSync()" execution, depending on "if" statement
      continueBothHere();
    })
    

    【讨论】:

    • 是的,谢谢,这就是我们在angularjs中解决问题的方法。 Observables 是 Promises 关于语法和功能的超集,我希望有一种可能的替代机制。也许只是在真正的分支中使用变量 (myObservable) 来控制整个程序流程?
    【解决方案2】:

    您可以将同步分支包装到 Observable 中并在任何地方订阅结果。

    checkCondition():Observable<any>{
     if (myCondition){
      // Async branch
      return myObservable.somethingAsync();
     } else {
      // Sync branch
      return Observable.of(somethingSync());
    }
    
    this.checkCondition.subscribe(result=>continueBothHere());
    

    【讨论】:

    • 很好,但是我如何将这个想法用作方法内的一系列语句的一部分?在某些情况下,将 if 语句取出并将其制成一个单独的方法可能会起作用,但在我的场景中,我有: statementA; if 语句;声明 B.因此,您的 checkCondition() 定义和该方法的以下调用必须替换“if 语句” - 我认为您不能这样做?
    • 更正:我的第一条评论的最后一部分应该是:...我有:statementA; if 语句; continueBothHere();声明 B.因此,您的 checkCondition() 定义和该方法的以下调用必须替换“if 语句; continueBothHere();” - 我认为你做不到?
    • 您需要在任何地方分离方法并将结果作为参数添加到 continueBothHere(result)。
    • 当一个方法包含一个同步代码、一个异步代码、其他东西,也许还有其他东西时,这是一种不好的做法……如果你不习惯使用 if,你可以尝试使用 @ 987654321@和map但是我没有看到真正的代码,很难说如何解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2013-10-09
    • 2014-01-06
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多