javascript - 等待异步事件处理程序的设计模式

标签 javascript design-patterns asynchronous promise

在我的应用程序中,有些地方的对象应该发出事件,并且应该延迟执行,直到所有事件处理程序完成工作。 事件处理程序可能正在执行异步操作(例如写入数据库)。

Application.on("login", function(evt) {
    // Asynchronous operation (e.g. update info in database)
});

Application.trigger("login").then(function() {
    // Execute stuff after all (async) event handlers are done
});

我环顾四周,没有找到任何既定的设计模式。我已经有了一个令我满意的实现,但我很好奇是否有人以不同的方式解决了这个问题?

最佳答案

我的解决方案是向 evt 参数添加一个 promises[] 属性。异步事件回调只需向该数组添加一个 Promise,triggerAsync 函数就会返回一个等待所有 Promise 解决的 Promise。

http://jsfiddle.net/nonplus/9aCC4/

triggerAsync 方法的实现(使用 Backbone 事件和 jQuery Promise,但也应该适用于其他堆栈):

// Trigger an event and return promise that waits on
// event handler promises
function triggerAsync(emitter, name, evt) {
    evt || (evt={});
    evt.promises = [];
    emitter.trigger(name, evt);
    return $.when.apply(null, evt.promises);
}

triggerAsync 的用法:

triggerAsync(obj, "myEvent").then(function() {
    // Code executed after event handlers are done
});

异步事件处理程序的实现:

// Async handler doing an ajax request
obj.on("myEvent", function (evt) {
    evt.promises.push($.ajax(...));
});

// Async handler doing generic async operation
obj.on("myEvent", function (evt) {
    var dfd = $.Deferred();
    evt.promises.push(dfd.promise());

    // Async operation
    // Eventually calls dfd.resolve() or dfd.reject()
});

关于javascript - 等待异步事件处理程序的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23392924/

相关文章:

javascript - Angular4 : Router not working. 路由错误:错误:序列中没有元素

javascript - 如何更改 html 日历表中的日程表等类(class)

c# - WebApi 中的微服务设计部分

javascript - 立即调用函数表达式 (IIFE) 与非立即调用函数表达式

java - 根据Java中对象的类型选择实现

c# - 调用包含来自 MVC Controller 的异步调用的服务的正确模式

performance - 带有矢量图层的 Leaflet.js 非常慢

javascript - 更改 Highcharts 工具提示值

java - 所有异步任务是否可以同时读取ArrayList而没有任何延迟

c# - 如何知道一组 BackgroundWorker 何时完成