【问题标题】:Returning Observable based on callback基于回调返回 Observable
【发布时间】:2017-11-29 10:23:00
【问题描述】:

我尝试根据我的需要调整来自 ngx-chips 的工作示例。这是 onRemoving 方法示例的样子:

public onRemoving(tag: TagModel): Observable<TagModel> {
        const confirm = window.confirm('Do you really want to remove this tag?');
        return Observable
            .of(tag)
            .filter(() => confirm);
    }

现在,我想使用具有 AskQuestion 方法的自定义组件而不是 windows.confirm,并具有以下签名:

AskQuestion(question: string, yesCallback: () => void, noCallback?: () => void): void {

所以现在我有多个回调,但 ngx-chips 组件希望我返回一个 observable。我尝试使用bindCallback 方法将回调转换为可观察对象:

 public onRemoving(tag: TagModel): Observable<TagModel> {

    const choiceCallback = (choice: boolean): TagModel=> {
      if (choice)
        return tag;
    };

    this.questionService.AskQuestion("Remove item?", () => choiceCallback(true), () => choiceCallback(false))

    return Observable.bindCallback(choiceCallback);
  }

但看起来我做错了。有什么想法吗?

【问题讨论】:

    标签: javascript angular typescript rxjs


    【解决方案1】:

    bindCallback()的定义如下:

    给它一个 f(x, callback) 类型的函数 f,它会返回一个函数 g,当作为 g(x) 调用时会输出一个 Observable。

    而且你的用法不符合这个描述。 choiceCallback() 不返回返回 observable 的函数。

    改用 Observable 构造函数:

    public onRemoving(tag: TagModel): Observable <TagModel> {
    
      return Observable.create(observer => {
        const choiceCallback = (choice: boolean) => {
          if (choice) {
            observer.next(tag);
          }
          observer.complete();
        };
    
        this.questionService.AskQuestion("Remove item?", () => choiceCallback(true), () => choiceCallback(false));
      });
    }

    【讨论】:

    • 完美的安德烈,非常感谢。您只是错过了choiceCallback 中的返回语句。
    • 故意没有退货声明。如果choice === true,当发布一个项目并完成,当false刚刚完成。
    • 你是对的,但是我必须删除 :TagModel 返回声明,否则我会收到以下错误:A function whose declared type is neither 'void' nor 'any' must return a value. 无论如何,它工作得很好!
    【解决方案2】:

    我对这个堆栈不是 100% 熟悉,但据我所知,bindCallback 返回一个函数,该函数返回一个 Observable (docs)。

    所以也许你需要调用它来获取一个 observable 并在你的 return 语句中使用它?
    因为在你的函数签名中说它会返回一个 Observable 类型。

    您可以尝试将 return 语句替换为:
    return Observable.bindCallback(choiceCallback)()

    【讨论】:

    • 感谢您的帮助,很遗憾这不起作用,但 Andrè 回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多