2017-05-15 6 views
0

私は以下の問題があります。私は購読しているオブザーバブルを持っており、次の条件を満たす必要があります。観察可能な状態で異なる条件を処理する

1 - registerUserは、コールバックデータの処理後に実行する必要があります。

2 - registerTaskがデータを返す場合、私はIDを取得し、またあるのregisterUserを呼び出す必要があり、観察

3 - registerTaskがエラーを返す場合、私はその後、IDとのregisterUserを取得するためにsearchTaskByIDを呼び出す必要があります

問題は、データとエラー括弧の両方にregisterUser関数を書きたくないということです。上の条件とは独立して実行するにはどうすればよいかわかりません。これを行う簡単な方法はありますか?

ここで私はこれまでのところ、意図したとおりに機能していないコード:

角度2の成分:catchは、エラー処理に使用することができます

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

観察可能なオペレータ。

デモを書きました。 registerTask()の第2引数を使用してエラーケースをシミュレートできます。

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

関連する問題