承诺作为控制国家的方式

时间:2015-08-29 13:51:21

标签: design-patterns typescript promise

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

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

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

然而,验证状态的改变不是一次性的事情。它会来回跳跃。它不再是完成一项行动的承诺。它可能会失败,重新失败,成功并可能再次失败。你会说承诺仍然是实现这一目标的有意义的方式吗?

有关如何以有意义的方式在typescript / javascript中实现这一点的任何评论,我们表示赞赏。

2 个答案:

答案 0 :(得分:1)

  

然而,验证状态的改变不是一次性的事情。它会来回跳跃。它不再是完成一项行动的承诺。它可能会失败,重新失败,成功并可能再次失败。你会说承诺仍然是实现这一目标的有意义的方式吗?

没有

您可以使用包含事件的机制:

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)的代码部分,请注意内存泄漏。在这种情况下,您需要添加一些内容来删除侦听器(例如,使用removeValidationListener返回的处理程序调用的方法addValidationListener

答案 1 :(得分:0)

您应该查看Observables,例如RX.js

从你的问题:

  

验证状态变化不是一次性的事情。它会来回跳跃。它不再是完成一项行动的承诺。它可能会失败,重新失败,成功并可能再次失败。你会说承诺仍然是实现这一目标的一种有意义的方式吗?

从此(非常好)Introduction to Reactive Programming

  

承诺只是一个具有一个单一发射值的Observable。 Rx流通过允许许多返回值来超越承诺。

(强调我的)