【问题标题】:return observable that is deferred返回延迟的可观察对象
【发布时间】:2021-01-14 18:17:52
【问题描述】:

我一直遇到这个问题,我认为我的方法不是最好的,希望能得到一些帮助。

我有一个函数返回一个直到一段时间才可用的可观察对象(用户单击模式按钮、http 调用完成等)。假设我想显示一个确认模式,然后根据用户的选择继续或从函数返回。 (注意:模式返回一个承诺)

doWork = () => {
  openConfirm().subsribe(res => {
    if (!res) { return };   // return from function if user selects 'No'
    
    // else proceed
  });
}

这是我认为我使用 from 返回可观察到的错误的地方

openConfirm = (): Observable<any> => {

  // ng bootstrap modal asking "Would you like to proceed" with a yes or no button 
  let modalRef = this.modalService.open(ConfirmModalComponent, {});


 return from(modalRef.result.then(res => {
        return true;  // Yes button
      }, () => { 
        return false;  // No button
      }));
  }
}

我希望 observable 等到用户在模式上选择 yes 或 no 后再返回。就像我的情况一样。但是有更清洁的方法吗?如果我删除 from() 运算符并返回 of(true) 或 of(false) 我会收到一个错误,我无法订阅 undefined。

【问题讨论】:

  • defer() 是您要找的吗?
  • @martin 不完全是,有时我订阅了 observables 并且数据还没有准备好立即返回,就像在这个例子中的模态点击一样),我要么得到订阅错误,要么必须做使用这个丑陋的 from() 代码或 of() 如果它不是一个承诺。

标签: angular rxjs observable ng-bootstrap


【解决方案1】:

我不确定,但请尝试使用 from 运算符,就像您使用 1 一样。

doWork = () => {
  openConfirm().subsribe(res => {
    // promise was a success - Yes clicked
  }, err => { // error callback of subscribe
    // promise was a failure - No clicked
  });
}
.....
openConfirm = (): Observable<any> => {

  // ng bootstrap modal asking "Would you like to proceed" with a yes or no button 
  let modalRef = this.modalService.open(ConfirmModalComponent, {});


   return from(modalRef.result)
  }
}

看看你是否可以利用从(Promise) 返回并订阅这个promise,看看observable 是否正确地传递到成功回调和错误回调。

【讨论】:

  • 谢谢,它可以工作而且更干净。我没有意识到一个被拒绝的承诺会命中 observable 的错误块。
猜你喜欢
  • 2017-07-13
  • 2018-04-11
  • 2017-01-01
  • 2017-07-12
  • 1970-01-01
  • 2016-11-02
  • 2018-12-16
  • 2018-11-13
  • 2019-02-18
相关资源
最近更新 更多