我试图在服务器上查询字符串令牌,然后客户端组件将使用该令牌。客户端上的meteor方法调用需要异步结果,并返回一个Observable。方法完成后,它会在Observable上调用next。该组件订阅了Observable。
然而,当代码运行时,就会出现问题。在调试器中,Observable没有任何订阅者。因此,调用next()时不会调用Subscriber回调。
我不清楚什么是错的,并且会欣赏另一组经验丰富的眼睛。
import { Component, OnInit, OnDestroy, Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { Subscription } from 'rxjs/Subscription';
import { Observable } from 'rxjs/Observable';
@Component({
selector: "test",
template: ``
})
export class TestComponent implements OnInit, OnDestroy {
myToken: Observable<string>;
private tokenSubscription: Subscription;
constructor(private theService: SomeService) {}
ngOnInit() {
this.myToken = this.theService.createToken();
this.tokenSubscription = this.myToken.subscribe((token: string) => {
this.doSomething(token);
});
}
ngOnDestroy() {
this.tokenSubscription.unsubscribe();
}
doSomething(token: string) {
// ...
}
}
@Injectable()
export class SomeService {
createToken(): Observable<string> {
let subject: Subject<string> = Subject.create();
Meteor.call("serverOnly.createToken", (err, result: {"data": string}) => {
if (err) {
throw new Meteor.Error("createToken", err);
} else {
subject.next(result.data);
}
});
return subject.asObservable();
}
}
答案 0 :(得分:1)
尝试抓住订阅中的错误
this.tokenSubscription = this.myToken.subscribe((token: string) => {
this.doSomething(token);
}, (err) => {
console.log(err);
});
- 的更新强> -
使用ReplaySubject
代替Subject
。由于Subject
只能将数据推送到过去的订阅者,即,在您的情况下,subject.next()
在订阅之前被调用,而不会将值推送到流,因为没有订阅者时刻。
let subject: ReplaySubject<string> = new ReplaySubject<string>(1);
此处 1 是缓冲区值,表示通过调用.next发出的先前值应该发送给未来的订阅者(在这种情况下,它是1之前的值)