[英]RxJs: $q.when analog in angular2
在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
。等於多少?
Observable.of(data)與$ q.when類似
您可以在$ Q映射到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);
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.