我有以下问题。我有一个可以观察到的观察,我需要满足以下要求:
1 - 必须在处理回调数据后执行registerUser。
2 - 如果registerTask返回数据,那么我得到一个ID并且必须调用registerUser,这也是一个可观察的
3 - 如果registerTask返回错误,那么我必须调用searchTaskByID来获取ID然后注册用户
问题是我不想在数据和错误括号中编写函数registerUser,我不知道如何独立于上述条件执行它。有没有简单的方法呢?
这是我到目前为止的代码,没有按预期工作:
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)}
)
)
}
答案 0 :(得分:1)
可观察的运算符catch可用于错误处理。
我写了一个demo。您可以使用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));