Context:
I have AWS cognito working on an Angular 2 app. The AWS demo uses callbacks to handle asynchronous requests.
public getSession(callback: CognitoCallback) {
let cognitoUser: CognitoUser = this.getCurrentUser();
let cognitoUtil = this;
cognitoUser.getSession(function (err, session) {
if (err) {
let error = new CognitoError(err.name, err.message);
callback.cognitoCallback(error, null);
return;
}
if (!session.isValid()) {
let error = new CognitoError("SessionInvalid", "Session is not valid");
callback.cognitoCallback(error, session);
return;
}
callback.cognitoCallback(null, session);
cognitoUtil.setCurrentUser(cognitoUser);
return;
});
}
Is it possible to implement the same functionality with Promise or Observable?
Thanks in advance.
You can also make use of a Subject and create the observable somewhat manually (but at least you might better understand how to do the conversion).
public getSession(callback: CognitoCallback): Observable<any> {
let cognitoUser: CognitoUser = this.getCurrentUser();
let cognitoUtil = this;
// You can easily get an Observable from an RxJS subject by calling asObservable().
// more importantly, you can send values/errors to that observable by calling subject.next(valueToSend) or subject.error(errorToSend)
let subject = new Subject();
cognitoUser.getSession(function (err, session) {
if (err) {
let error = new CognitoError(err.name, err.message);
//callback.cognitoCallback(error, null);
// replace with subject error notification
subject.error(error);
return;
}
if (!session.isValid()) {
let error = new CognitoError("SessionInvalid", "Session is not valid");
//callback.cognitoCallback(error, session);
subject.error(error);
return;
}
//callback.cognitoCallback(null, session);
// send the session down through the observable
subject.next(session);
cognitoUtil.setCurrentUser(cognitoUser);
// finish off the observable
subject.complete();
return;
});
return subject.asObservable();
}
The example above will return an Observable that you can then use for other purposes.