上下文:
我让AWS cognito在Angular 2应用程序上工作。 AWS演示使用回调来处理异步请求。
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;
});
}
是否可以使用Promise或Observable实现相同的功能?
提前致谢。
答案 0 :(得分:1)
绝对。 RXJS本身提供了一个函数,用于将回调转换为Observable
并完全按照您的想法使用它。
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromcallback.md
答案 1 :(得分:1)
您也可以使用主题并稍微手动创建可观察对象(但至少您可能更好地了解如何进行转换)。
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();
}
上面的示例将返回一个Observable,然后您可以将其用于其他目的。
答案 2 :(得分:0)
如果您使用bluebird,则可以执行此操作
let getSession = Promise.promisify(cognitoUser.getSession);
getSession.then(function (session) {
// session is valid
}, function (err) {
// error getting session
});