【问题标题】:Handle different conditions with observables使用可观察对象处理不同的条件
【发布时间】:2017-10-14 04:26:11
【问题描述】:

我有以下问题。我有一个订阅的 observable,我需要满足以下要求:

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

2 - 如果 registerTask 返回数据,那么我会得到一个 ID 并且必须调用 registerUser 这也是一个 observable

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

问题是我不想在数据和错误括号中编写函数 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)}
  )

)


}

【问题讨论】:

  • 上面的代码怎么没有按预期工作?
  • 例如:如果 registerTask 返回一个错误,那么如预期的那样,searchTaskByName 被成功执行。但在那之后, registerUser 将不会被执行。之后我需要执行 registerUser。

标签: angular typescript


【解决方案1】:

可观察运算符catch 可用于错误处理。

我写了演示。您可以使用 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多