Angular2回调vs Promise / Observable

时间:2017-03-29 15:39:52

标签: angular rxjs es6-promise

上下文:

我让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实现相同的功能?

提前致谢。

3 个答案:

答案 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
});