这取决于您的场景是真正的事件,还是更多的异步操作:
基于事件
使用诸如微事件之类的东西,您可以执行以下操作。这种模式非常常见且简单,因此我建议您在某些时候自己尝试一下,因为从理解的角度来看它很棒。
MicroEvent.mixin(A);
A.Foo = function () {
//Do stuff A needs to do, then:
A.trigger('foo-complete');
};
//Somewhere nice and separate and decoupled
A.bind('foo-complete', B.Bar);
如果您需要执行更复杂的操作,例如过滤事件、映射事件等。反应式扩展(基于 C# 库)非常强大,但如果您不需要该功能,这是一个可以加载的大库。
异步操作
使用回调
这可以使用回调来完成,这对于相当简单的操作非常有用:
A.Foo = function (cb) {
//Do stuff A needs to do, then:
if (cb) cb();
};
A.Foo(B.Bar);
使用承诺
这些最初看起来更复杂,但它们很容易组合,并且内置了处理错误的好方法。
使用Q这是更流行的 Promise 库之一(同样,有很多这样的库):
A.Foo = function () {
var def = Q.defer();
setTimeout(function () {
//Simulate async operation
def.resolve();
}, 1000);
return def.promise;
};
A.Foo().then(B.Bar).end();
使用控制流库
控制流库(可以说是 Promise 的一个特例)旨在帮助您编写基于回调系统的操作。