2017-05-15 54 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