我希望您对我的部分代码中使用promises的意见。
我有一个视图,我们称之为Foo
。 Foo
实现了接口EmbeddableView
。
我在视图Bar
中嵌入了Foo。 Foo
不知道它是嵌入在任何地方的,而Bar
并不关心Foo
的内容,只有它是有效的。发生这种情况的方法是界面EmbeddableView
有一个function
,如getValidationPromise
返回一个承诺。
当视图Foo
解析承诺时,会通知bar
其内容无效或有效。
然而,验证状态的改变不是一次性的事情。它会来回跳跃。它不再是完成一项行动的承诺。它可能会失败,重新失败,成功并可能再次失败。你会说承诺仍然是实现这一目标的有意义的方式吗?
有关如何以有意义的方式在typescript / javascript中实现这一点的任何评论,我们表示赞赏。
答案 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流通过允许许多返回值来超越承诺。
(强调我的)