如何在 rxjs 6 中订阅多个 observable? do 不是 rxjs 6 中的函数
How to subscribe multiple observable in rxjs 6 ? do is not a function in rxjs 6
在 rxjs 5.5.12
中,我创建了一个 login()
到 subscribe
并由 do()
多次观察
login(userEmail, userPassword).subscribe((response) => {
console.log(response);
if (response === 'something') {
// some actions
} else {
// some actions
}
},(error) => {
// some error actions
});
我使用 rxLoginPOST 调用 api:
rxLoginPOST(url, params) {
return Rx.Observable.fromPromise(somePromise).catch(handleErrFunction);
}
我在登录函数中使用它 return 多个可观察到的:
login(email, password) {
return APIService.shared.rxLoginPOST('users/signin', { ...arguments })
.flatMap((response) => {
if (response.status === 200) {
return Rx.Observable.combineLatest(
myObservable1,
myObservable2,
myObservable3
)
} else {
return Rx.Observable.of(response)
}
}).do((result) => {
if (result.length > 0) {
// some logic
} else {
return Rx.Observable.of(result)
}
}).flatMap((result) => {
if (result.length > 0) {
return this.checkUserIsRegistered()
} else {
return Rx.Observable.of(result)
}
})
}
在 rxjs 6.5.3
中,我更改了所有导入,如
import { Observable, combineLatest, of } from 'rxjs';
import { mergeMap, map, catchError, flatMap, tap } from 'rxjs/operators';
如果我触发 login()
它将显示 do is not a function
所以我更改代码:
login(userEmail, password) {
return APIService.shared.rxLoginPOST('users/signin', { ...arguments }).pipe(
mergeMap((response) => {
if (response.status === 200) {
return combineLatest(
myObservable1,
myObservable2,
myObservable3
)
} else {
return of(response)
}
}).tap((result) => { // I am stuck here, I have no idea how to continue with it...
console.log('check 4'); // check 4 does not appear.
console.log('response', response);
return of(response)
}
);
我尝试用tap
代替do
,但是check 4没有出现。
如有任何帮助,我们将不胜感激。
对于 pipe
,您应该像这样链接您的运算符:pipe(op1, op2)
而不是 pipe(op1).op2()
login(userEmail, password) {
return APIService.shared.rxLoginPOST('users/signin', { ...arguments })
.pipe(
mergeMap((response) => {
if (response.status === 200) {
return combineLatest(
myObservable1,
myObservable2,
myObservable3
)
}
return of(response)
}),
tap((result) => {
console.log('check 4'); // check 4 does not appear.
console.log('response', response);
})
);
我还删除了你无用的 else
声明,因为你之前退货了:)
编辑:正如评论中所建议的那样,tap
中的 return
指令也已删除,因为不必要的
在 rxjs 5.5.12
中,我创建了一个 login()
到 subscribe
并由 do()
login(userEmail, userPassword).subscribe((response) => {
console.log(response);
if (response === 'something') {
// some actions
} else {
// some actions
}
},(error) => {
// some error actions
});
我使用 rxLoginPOST 调用 api:
rxLoginPOST(url, params) {
return Rx.Observable.fromPromise(somePromise).catch(handleErrFunction);
}
我在登录函数中使用它 return 多个可观察到的:
login(email, password) {
return APIService.shared.rxLoginPOST('users/signin', { ...arguments })
.flatMap((response) => {
if (response.status === 200) {
return Rx.Observable.combineLatest(
myObservable1,
myObservable2,
myObservable3
)
} else {
return Rx.Observable.of(response)
}
}).do((result) => {
if (result.length > 0) {
// some logic
} else {
return Rx.Observable.of(result)
}
}).flatMap((result) => {
if (result.length > 0) {
return this.checkUserIsRegistered()
} else {
return Rx.Observable.of(result)
}
})
}
在 rxjs 6.5.3
中,我更改了所有导入,如
import { Observable, combineLatest, of } from 'rxjs';
import { mergeMap, map, catchError, flatMap, tap } from 'rxjs/operators';
如果我触发 login()
它将显示 do is not a function
所以我更改代码:
login(userEmail, password) {
return APIService.shared.rxLoginPOST('users/signin', { ...arguments }).pipe(
mergeMap((response) => {
if (response.status === 200) {
return combineLatest(
myObservable1,
myObservable2,
myObservable3
)
} else {
return of(response)
}
}).tap((result) => { // I am stuck here, I have no idea how to continue with it...
console.log('check 4'); // check 4 does not appear.
console.log('response', response);
return of(response)
}
);
我尝试用tap
代替do
,但是check 4没有出现。
如有任何帮助,我们将不胜感激。
对于 pipe
,您应该像这样链接您的运算符:pipe(op1, op2)
而不是 pipe(op1).op2()
login(userEmail, password) {
return APIService.shared.rxLoginPOST('users/signin', { ...arguments })
.pipe(
mergeMap((response) => {
if (response.status === 200) {
return combineLatest(
myObservable1,
myObservable2,
myObservable3
)
}
return of(response)
}),
tap((result) => {
console.log('check 4'); // check 4 does not appear.
console.log('response', response);
})
);
我还删除了你无用的 else
声明,因为你之前退货了:)
编辑:正如评论中所建议的那样,tap
中的 return
指令也已删除,因为不必要的