简体   繁体   English

使用可观察对象处理不同条件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM