私は、observableを使用して最初のイベントをリッスンするメソッドを持ち、タイムアウトは15秒です。このメソッドは、パラメータがnullまたは空の場合はエラーをスローするネストされたobservableを呼び出します。 Observable.throw()を使用しますが、エラーはタイムアウト/ 15秒後にのみ伝播します。ネストされたobservableは、タイムアウト後にのみエラーを伝播します
this.signUp(this.user)
.first()
.timeout(15000)
.subscribe((authResponse) => {
console.log("next fired");
dialogs.alert("Next: " + authResponse);
}, (error) => {
//fired only after 15s when mobile is empty
console.log("error fired");
console.log(JSON.stringify(error));
},() => {
console.log("completed fired");
});
サインアップ()
public signUp(user: User): Observable<AuthResponse> {
let observable = new Subject<AuthResponse>();
this.isUserExisting(user.mobile)
.first()
.subscribe((isUserExisting) => {
if (isUserExisting) {
console.log("User already exists");
observable.next(AuthResponse.USER_EXISTING);
} else {
console.log("User does not exist");
this.saveUser(user).first().subscribe(() => {
observable.next(AuthResponse.SUCCESS);
})
}
}, (error) => {
return Observable.throw(error);
})
return observable;
}
public isUserExisting(mobile: string): Observable<boolean> {
let observable = new Subject<boolean>();
if (!mobile) {
console.log("empty mobile");
return Observable.throw(new Error("Mobile number cannot be empty"));
}
firebase.query(() => { }, "/users",
{
singleEvent: true,
orderBy: {
type: firebase.QueryOrderByType.CHILD,
value: "mobile"
},
range: {
type: firebase.QueryRangeType.EQUAL_TO,
value: mobile
}
}
).then((result) => {
console.log("Checking for user success: ");
console.log(JSON.stringify(result));
observable.next(result.value != null);
});
return observable;
}
更新: saveUser()
public saveUser(user: User) {
return Observable.defer(() => firebase.push('/users', user)
.then((result) => {
console.log("Created user record with key: " + result.key);
console.log("Dumping result:");
console.log(JSON.stringify(result));
})
.catch((error) => {
console.log("Error while saving user: " + error);
})
)
}
? – danieljohngomez
また、ネストされたobservable saveUser()を呼び出すにはどうすればよいですか? – danieljohngomez
こんにちはDaniel、はい私の経験では、ほとんどの場合、fromPromise()の代わりに 'defer()'を使いたいと思っています。元の答えを更新して、 'saveUser()'メソッドを組み込んでいます。 'signUp(user).subscribe(res => console.log(res))'は、実行するために必要なものです –