【问题标题】:Angular2 callback vs Promise/ObservableAngular2 回调与 Promise/Observable
【发布时间】:2018-07-02 22:01:59
【问题描述】:

上下文:

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

提前致谢。

【问题讨论】:

    标签: angular rxjs es6-promise


    【解决方案1】:

    您也可以使用 Subject 并手动创建 observable(但至少您可能会更好地理解如何进行转换)。

    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】:

      当然。 RXJS 原生提供了一个将回调转换为Observable 的函数,并完全按照您的想法使用它。

      https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromcallback.md

      【讨论】:

        【解决方案3】:

        如果你使用bluebird,你可以这样做

        let getSession = Promise.promisify(cognitoUser.getSession);
        
        getSession.then(function (session) {
        // session is valid
        }, function (err) {
        // error getting session
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-07
          • 1970-01-01
          • 2017-03-15
          • 2017-07-29
          • 2017-11-01
          • 2018-12-14
          • 2017-03-22
          • 2018-11-25
          相关资源
          最近更新 更多