RxJs:$ q。当在angular2中模拟

时间:2017-04-19 15:00:37

标签: angularjs angular typescript rxjs

在AngularJS 1. *我曾经写过这部分代码,刷新auth-token:

public class RealmThingA extends RealmObject {
    private RealmThingB realmThingB;

    public RealmThingA() {}

    public RealmThingB getRealmThingB() { return realmThingB; }

    public void setRealmThingB(RealmThingB realmThingB) {
        this.realmThingB = realmThingB;
    }
}

public class RealmThingB extends RealmObject {
    private String value;

    public RealmThingB() { }

    public String getValue() { return value; }

    public void setValue(String value) {
        this.value = value;
    }
}

如何在Angular 2中使用Observable翻译此代码?

我甚至不知道,因为这不起作用:

...

if (!refreshTokenInProgress) {
  refreshTokenInProgress = AuthService.refreshToken();
}


$q.when(refreshTokenInProgress, function () {
  refreshTokenInProgress = null;

  // re-send requests with error
  ...
}, function () {
  // logout if refresh token rejected

  refreshTokenInProgress = null;

  ...
});

...

RxJs中if (!refreshTokenInProgress) { refreshTokenInProgress = AuthService.refreshToken().subscribe(); } Observable.forkJoin([this.refreshTokenInProgress]).subscribe( success => this.refreshTokenInProgress = null ); 的等值是什么?

1 个答案:

答案 0 :(得分:1)

Observable.of(data)类似于$ q.when

您可以在$Q map to RxJS

上阅读有关将$ q映射到RxJS的帖子

这是真实代码的一个例子:

spyOn(myService, 'getData').and.returnValue(Observable.of([{id: 1}, {id: 2}]));

或稍微复杂一点:

   deleteRole(role: Role) {
Observable.fromPromise(this.confirmDialogService.open(DELETE_ROLE_TITLE, DELETE_ROLE_CONFIRM_BODY({name: role.name})))
  .switchMap(result => result ? Observable.of(result) : Observable.empty())
  .switchMap(() => this.rolesService.getUsersForRole(role.id))
  .switchMap(({elements: users}) => {
    return _.isEmpty(users) ?
      Observable.of(users) :
      Observable.fromPromise(
        this.confirmDialogService.open(ROLE_IN_USE_TITLE,
          ROLE_IN_USE_CONFIRM_BODY({users: users.map(({firstName, lastName}) => `${firstName} ${lastName}`)}),
          {hideCancelButton: true})
      ).switchMap(() => Observable.empty());
  })
  .switchMap(() => this.rolesService.deleteRole(role))
  .subscribe(data => {
      this.toastr.success(`Role '${role.name}' is deleted`, 'Success');
      this.findallRoles(); //Refresh role grid;
      this.roleDeleted.emit();
    },
    error => {
      this.toastr.error(error, 'Error (rolesService.delete)!', {dismiss: 'click'});
      console.error(error);
    });

}