gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:19:37 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com