Javascript 异步分支和同步分支使用角度可观测值相遇
假设我们有一个简单的伪代码段,如下所示:Javascript 异步分支和同步分支使用角度可观测值相遇,javascript,angular,rxjs,branch,observable,Javascript,Angular,Rxjs,Branch,Observable,假设我们有一个简单的伪代码段,如下所示: if (myCondition){ // Async branch myObservable .somethingAsync() .subscribe(x => { doSomething(x); }); } else { // Sync branch somethingSync(); } continueBothHere(); 因此,一个异步分支和一个同步分支,其中continueBothHe
if (myCondition){
// Async branch
myObservable
.somethingAsync()
.subscribe(x => {
doSomething(x);
});
} else {
// Sync branch
somethingSync();
}
continueBothHere();
因此,一个异步分支和一个同步分支,其中continueBothHere()总是在if语句之后执行。
假设continueBothHere()不需要来自任何一个分支的任何输入
如何使用可观察对象实现这一点
我想我想在if语句之前定义一个Observable,这样我就可以在if语句之后使用它来连接分支?但这能与真实分支中的可观察性相结合吗?我要说的是,假象分支内部的可观察到的东西,如果有的话?也许这不需要使用if语句就可以实现
需要明确的是:在真正的分支中,我希望在执行doSomething(x)之后再执行continueBothHere()当我处理
可观察的
时,我希望将其包括到异步链中,或者同步和异步操作中,它们应该具有相同的后续步骤,我通常从新承诺开始。通过这种方式,您可以轻松地使代码异步,并在然后块中处理数据:
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();
})
您可以将同步分支包装到Observable中,并在任何地方订阅结果
checkCondition():Observable<any>{
if (myCondition){
// Async branch
return myObservable.somethingAsync();
} else {
// Sync branch
return Observable.of(somethingSync());
}
this.checkCondition.subscribe(result=>continueBothHere());
checkCondition():可观察{
if(霉菌病){
//异步分支
返回myObservable.somethingsync();
}否则{
//同步分支
返回(somethingSync())的可观测值;
}
subscribe(result=>continueBothHere());
是的,谢谢,这就是我们在angularjs中解决问题的方法。Observables是关于语法和功能的承诺的超集,我希望有一种可能的替代机制。可能只是使用变量(myObservable)在true分支中,也要控制整个程序流?很好,但是我如何将此想法作为方法中语句序列的一部分使用?在某些情况下,将if语句取出并将其放入单独的方法中可能会起作用,但在我的场景中,我有:statementA;if语句;statementB。因此您的checkCondition()定义和方法的以下调用必须替换“if statement”-我认为您不能这样做?更正:我的第一条注释的最后一部分应该是:…我有:statementA;if statement;continueBothHere();statementB。因此,您的checkCondition()定义和方法的以下调用必须替换“if语句;continueBothHere();”-我认为您不能这样做?您需要在任意位置分离方法,并将结果作为参数添加到continueBothHere(result)当一个方法包含同步代码、异步代码、其他东西,或者其他东西时,这是一种糟糕的做法……如果你不习惯使用If,你可以尝试使用,但我没有看到真正的代码,很难告诉你如何解决问题。