[英]Handle different conditions with observables
i have the following problem. 我有以下问题。 I have an observable which I subscribe to and I need to meet the following requierements:
我订阅了一个观察站,需要满足以下要求:
1 - registerUser must be executed after the callback data is processed. 1-必须在处理回调数据后执行registerUser。
2 - If registerTask returns data, then I get an ID and have to call registerUser which is also an observable 2-如果registerTask返回数据,那么我得到一个ID并必须调用registerUser,这也是一个可观察到的
3 - If registerTask returns error, then I have to call searchTaskByID to get an ID and then registerUser 3-如果registerTask返回错误,那么我必须调用searchTaskByID以获得ID,然后registerUser
The problem is that I dont want to write the function registerUser in both the data and error brackets and I dont know how can I get it executed independently of the conditions above. 问题是我不想在数据和错误括号中都写函数registerUser,而且我不知道如何独立于上述条件才能执行它。 Is there any easy way of doing this?
有没有简单的方法可以做到这一点?
Here the code I have so far, not working as intended: 这是我到目前为止的代码,无法按预期工作:
Angular 2 component: Angular 2组件:
taskID:String
constructor(
private myService:MyService,
private router:Router
) { }
onClick() {
const task= {
name: this.taskID,
}
const user= {
name: "test",
}
return this.myService.registerTask(task).subscribe(
(data) => {console.log(data)
var taskId = data.taskId},
(error) => {console.log(error)
this.myService.searchTaskByName(task).subscribe(
(data) => {console.log(data)
var taskId = data.id},
(error) => {console.log(error)},
()=>{}
);
},
() => this.myService.registerUser(user).subscribe(
(data) => {console.log(data)
var userId = data.id},
(error) => {console.log(error)}
)
)
}
Observable operator catch can be used in error handling. 可观察到的操作员捕获可用于错误处理。
I wrote demo. 我写了演示。 You can simulate error case using second argument of registerTask().
您可以使用registerTask()的第二个参数模拟错误情况。
function registerTask(task:string, forceError = false) {
// console.log('registerTask called');
return Observable.defer(() => {
return Observable.of(1).delay(1000)
.map(value => {
if (forceError)
throw 'ERROR';
return value;
});
});
}
function registerUser(user:string) {
// console.log('registerUser called');
return Observable.of('userID').delay(1000);
}
function searchTaskByName(task:string) {
// console.log('searchTaskByName called');
return Observable.of(2).delay(1000);
}
// registerTask('task', true) // forceError
registerTask('task')
.catch((err, caught) => {
return searchTaskByName('task');
})
.mergeMap(taskID => {
console.log(`taskID = ${taskID}`)
return registerUser('user');
})
.subscribe(userID => console.log(userID));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.