Angular 如何将三个回调函数作为一个对象接收到subscribe方法中?
在我们做了一些观察之后Angular 如何将三个回调函数作为一个对象接收到subscribe方法中?,angular,rxjs,Angular,Rxjs,在我们做了一些观察之后 let observable = new Observable(observer => { let x = 5; if (x == 15) { observer.error('something went wrong'); } else { observer.next('produce some value'); } observer.complete(); });
let observable = new Observable(observer => {
let x = 5;
if (x == 15) {
observer.error('something went wrong');
} else {
observer.next('produce some value');
}
observer.complete();
});
从观察者订阅这三个回调函数有不同的方式
observable.subscribe(
function next(data) {
console.log(data);
},
function error(err) {
console.log(err);
},
function complete() {
console.log('done');
}
)
或使用箭头函数,使用函数关键字
observable.subscribe(
x =>
{
console.log(x);
},
err =>
{
console.log(err);
},
() =>
{
console.log('done');
},
这两种方法都是有效的,所以在subscribe方法的最后,我们以三种方法结束
从观察者获取值的函数
observable.subscribe(
function next(data) {
console.log(data);
},
function error(err) {
console.log(err);
},
function complete() {
console.log('done');
}
)
但是当我写的时候,比如说
observable.subscribe({
next: (data) => console.log(data),
error: (err) => console.log(err),
complete: () => console.log('done')
})
它仍在工作。但我不明白它是如何工作的,因为这里我们有三个功能
在一个物体内部。在前两个示例中,我们直接使用了三个函数
我的问题是,当函数“包装”在一个对象中时,它是如何工作的以及为什么工作的?下面是subscribe的伪代码实现
subscribe(...args){
let observer = {
next: _ => {/* Do nothing */},
error: err => { throw err },
complete: () => {/* Do nothing */}
}
if(isAFunction(args[0])) observer.next = args[0];
if(isAFunction(args[1])) observer.error = args[1];
if(isAFunction(args[2])) observer.complete = args[2];
if(isAnObject(args[0])){
const partialObserver = args[0];
if(isAFunction(partialObserver.next)) observer.next = partialObserver.next;
if(isAFunction(partialObserver.error)) observer.error = partialObserver.error;
if(isAFunction(partialObserver.complete)) observer.complete = partialObserver.complete;
}
return this._subWithObserver(observer);
}
显然,这还不是全部,但这是一个如何实现的想法。您可以深入了解源代码,了解如何将部分观察者和/或函数映射到适当的观察者
在场景后面,
error
和complete
实际上被检测,以确保维护可观察的契约。这就是subscribe方法的编写方式。它最多可接受3次回调或一个像您那样实现的对象。这两种方法都是等效的。好的,昆汀,谢谢你的反馈。我如何在订阅方法的背景中看到实现?你通常可以在你的节点单元模块中检查类型定义。在我的例子中,它位于node_modules/rxjs/internal/Observable.d.ts中,然后搜索“subscribe”。但是如果你想查看源代码,请查看github存储库谢谢Mrk。我接受了你的答案并对其进行了投票。你能不能在评论中或者在你的回答中写下你粘贴在这里的源代码的链接,从他们的文档中?我想在这里找到,但没找到。