Promises 作为控制状态的方式

Promises as way of controlling state

我希望您对我的部分代码中使用 promises 提出意见。

我有一个视图,我们称它为 FooFoo 实现接口 EmbeddableView。 我在视图 Bar 中嵌入了 Foo。 Foo 不知道它嵌入在任何地方并且 Bar 不关心 Foo 的内容,只关心它是否有效。发生这种情况的方式是接口 EmbeddableView 有一个 functiongetValidationPromise 返回一个承诺。

当视图 Foo 解析承诺时,bar 会收到通知,其内容要么无效,要么有效。

但是,验证状态更改不是一次性的。它会来回跳跃。它不再是对完成操作的承诺。它可以失败、再次失败、成功,也可能再次失败。你会说 promises 仍然是一种有意义的实现方式吗?

任何关于如何在 typescript/javascript 中以有意义的方式实现这一点的评论都将受到赞赏。

However, that validation state change is not a one time thing. It will jump back and forth. It is no longer a promise on the completion of an operation. It can fail, re-fail, success and maybe fail again. Would you say promises is still a meaningful way of implementing this?

没有

您可以使用事件机制:

interface EmbeddableView {
    addValidationListener(listener: (valid: boolean) => void): void;
}

在实现中,将监听器存储在一个数组中,然后在每次状态变化时调用所有监听器:

class Foo implements EmbeddableView {
    private listeners = [];

    public addValidationListener(listener: (valid: boolean) => void) {
        this.listeners.push(listener);
    }

    private fireValidationListeners(valid: boolean) {
        for (let cb of this.listeners)
            cb(valid);
    }
}

如果创建侦听器 (Bar) 的代码部分被删除/重新生成,请注意内存泄漏。在这种情况下,您需要添加一些内容来删除侦听器(例如,使用 addValidationListener 返回的处理程序调用的方法 removeValidationListener)。

你应该看看 Observables,例如 RX.js

根据你的问题:

validation state change is not a one time thing. It will jump back and forth. It is no longer a promise on the completion of an operation. It can fail, re-fail, success and maybe fail again. Would you say promises is still a meaningful way of implementing this?

从此(很好)Introduction to Reactive Programming:

A Promise is simply an Observable with one single emitted value. Rx streams go beyond promises by allowing many returned values.

(强调我的)