Javascript 仅当';完成了
我使用rxjs,我的问题是,如果我想调用下一个函数,是否只有在可观察对象完成时才调用?因此,与此相反:Javascript 仅当';完成了,javascript,angular,typescript,rxjs,observable,Javascript,Angular,Typescript,Rxjs,Observable,我使用rxjs,我的问题是,如果我想调用下一个函数,是否只有在可观察对象完成时才调用?因此,与此相反: this.Start(data).subscribe( (data) => { console.log('next'); }, (err) => { console.log('err'); }, () => { console.log('complete'); this.
this.Start(data).subscribe(
(data) => {
console.log('next');
},
(err) => {
console.log('err');
},
() => {
console.log('complete');
this.nextFunction() // this return with other observable
.subscribe(
(data) => {
console.log('next');
},
(err) => {
console.log('err');
},
() => {
console.log('complete');
this.nextFunction2(); // this returns with other observable
.subscribe(
(data) => {
console.log('next');
},
(err) => {
console.log('err');
},
() => {
console.log('complete');
this.nextFunction3()
.subscribe(...)
}
);
}
);
}
);
大概是这样的:
this.Start(data).subscribe(
(data) => {
console.log('next');
},
(err) => {
console.log('err');
},
() => {
console.log('complete');
return other observable;
}
)
.then(
(data) => {
console.log('next');
},
(err) => {
console.log('err');
},
() => {
console.log('complete');
return other observable;
}
)
.then(
(data) => {
console.log('next');
},
(err) => {
console.log('err');
},
() => {
console.log('complete');
return other observable;
}
);
所以我不想把我的代码设计成金字塔。你可以使用静态操作符来组成一个可观察对象,一个接一个地订阅可观察对象:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/concat';
import 'rxjs/add/observable/defer';
Observable.concat(
this.Start(data),
Observable.defer(() => this.nextFunction()),
Observable.defer(() => this.nextFunction2()),
Observable.defer(() => this.nextFunction3()),
)
.subscribe();
请注意,运算符用于延迟获得子序列可观测值的调用
其中包含一些日志:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/concat';
import 'rxjs/add/observable/defer';
import 'rxjs/add/operator/do';
Observable.concat(
this.Start(data).do(
(value) => { console.log("next: Start:", value); },
(error) => { console.log("error: Start:", error); },
() => { console.log("completed: Start"); }
),
Observable.defer(() => this.nextFunction().do(
(value) => { console.log("next: nextFunction:", value); },
(error) => { console.log("error: nextFunction:", error); },
() => { console.log("completed: nextFunction"); }
)),
Observable.defer(() => this.nextFunction2().do(
(value) => { console.log("next: nextFunction2:", value); },
(error) => { console.log("error: nextFunction2:", error); },
() => { console.log("completed: nextFunction2"); }
)),
Observable.defer(() => this.nextFunction3().do(
(value) => { console.log("next: nextFunction3:", value); },
(error) => { console.log("error: nextFunction3:", error); },
() => { console.log("completed: nextFunction3"); }
)),
)
.subscribe();
谢谢,这很有效!我用concat代替concatMap,因为我不存在第二个
concatMap
是一个打字错误。我试过了,如果出现错误会发生什么。错误('hups');我在启动功能中使用了这个,我在控制台上看到了这个:“error:start:hups”和dispose,但在这之后,应用程序崩溃了,并显示以下消息:throw sink.syncErrorValue;就这些。我应该如何处理此异常以不杀死应用程序,而只是断开链?通过传递给订阅的错误函数处理它(在下一个函数之后)