2017-05-15 55 views
0

我有以下问题。我有一个我订阅的观察点,我需要满足以下要求:处理不同的可观察条件

1 - registerUser必须在处理回调数据后执行。

2 - 如果registerTask返回数据,然后我得到的ID和要调用registerUser这也是可观察到的

3 - 如果registerTask返回错误,那么我必须调用searchTaskByID获取ID,然后registerUser

问题是我不想写数据和错误括号中的函数registerUser,我不知道如何独立于上述条件执行它。有没有简单的方法来做到这一点?

在这里,代码我到目前为止,不按预期运行:

角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

上面的代码是如何按预期工作的? –

+0

例如:如果registerTask返回错误,则假定searchTaskByName成功执行。但在此之后,registerUser将不会被执行。之后我需要registerUser来执行。 – Battalgazi

回答

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)); 
+0

它只是工作。 :) 谢谢! – Battalgazi