【问题标题】:RxJs: $q.when analog in angular2RxJs:$q.when angular2 中的模拟
【发布时间】:2017-09-15 21:36:29
【问题描述】:

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

...

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


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

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

  refreshTokenInProgress = null;

  ...
});

...

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

我什至不知道,因为这行不通:

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

Observable.forkJoin([this.refreshTokenInProgress]).subscribe(
  success => this.refreshTokenInProgress = null
);

RxJs 中的$q.when 等于什么?

【问题讨论】:

    标签: angularjs angular typescript rxjs


    【解决方案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);
        });
    

    }

    【讨论】:

    • if (!this.refreshTokenInProgress) { this.refreshTokenInProgress = authService.refreshToken().subscribe(); } Observable.of(this.refreshTokenInProgress).subscribe( result => console.log('res') ); 这不能正常工作 写Observable.of(this.refreshTokenInProgress).toPromise().then(function () { 不是一个好主意:)
    • omg :) 我改用ngx-restangular,一切都很好:)
    猜你喜欢
    • 2016-12-03
    • 2017-04-06
    • 2017-05-04
    • 2016-11-17
    • 2016-11-23
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    相关资源
    最近更新 更多