用可观察的

时间:2017-05-15 11:41:30

标签: angular typescript

我有以下问题。我有一个可以观察到的观察,我需要满足以下要求:

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)}
  )

)


}

1 个答案:

答案 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));