似乎我想做的事情是不可能的,兩種模式相沖突。爲了最終達到我想要的效果,我將模塊封裝到一個類似數組的對象中,並使用一些事件方法將其傳遞給模塊的對象,該對象繼承了async-eventemitter
類。
所以,認爲它是這樣的...
- 我的自定義應用程序模塊可以繼承異步eventemitter模塊,以便他們有
.on()
和.emit()
等方法。
- 我創建了一個自定義的數組項,這將允許我將事件傳遞給將會異步工作的模塊。
我創建的代碼(這是不完整或完善)...
// My private indexer for accessing the modules array (below) by name.
var module_dict = {};
// An array of my modules on my (express) app object
app.modules = [];
// Here I extended the array with easier ways to add and find modules.
// Haven't removed some code to trim down this. Let me know if you want the code.
Object.defineProperty(app.modules, 'contains', { enumerable: false, ... });
Object.defineProperty(app.modules, 'find', { enumerable: false, ... });
// Allows us to add a hook/(async)event to a module, if it exists
Object.defineProperty(app.modules, 'on', { enumerable: false, configurable: false, value: function(modulename, action, func) {
if (app.modules.contains(modulename)) {
var modu = app.modules.find(modulename);
if (modu.module && modu.module['on']) {
// This will pass on the event to the module's object that
// will have the async-eventemitter inherited
modu.module.on(action, func);
}
}
} });
Object.defineProperty(app.modules, 'once', { enumerable: false, configurable: false, value: function(modulename, action, func) {
if (app.modules.contains(modulename)) {
var modu = app.modules.find(modulename);
if (modu.on) {
modu.on(action, func);
}
}
} });
這就讓我通過簡單地調用類似如下的事件處理程序模塊綁定... .on(module_name, event_name, callback)
app.modules.on('my_special_module_name', 'loaded', function(err, data, next) {
// ...async stuff, that then calls next to continue to the next event...
if (data.filename.endsWith('.jpg'))
data.dimensions = { width: 100, height: 100 };
next(err, data);
});
然後執行它,我會做這樣的事情(快遞)...
app.get('/foo', function(req, res, next) {
var data = {
filename: 'bar.jpg'
};
// Now have event handlers alter/update our data
// (eg, extend an object about a file with image data if that file is an image file).
my_special_module.emit('loaded', data, function(err, data) {
if (err) next(err);
res.send(data);
next();
});
});
再一次,這只是我做過的一個例子,所以我可能錯過了上面我的副本中的某些內容,但實際上這是我最終使用的設計,它的工作方式像一種享受,我能夠擴展數據在被推送到我的HTTP響應之前,不需要替換主[expressjs]對象的標準EventEmitter模型。
(例如,我添加圖像數據,我們正在加載,我們是圖像文件的文件。如果有人想代碼,讓我知道,我很樂意分享我做了什麼)
還,我不能廢除EventEmitter模型,因爲我使用這個模塊來附加模塊化的crud函數。 –
在CPS中,你不能逃避嵌套的回調。有了承諾,您可以更線性地組織代碼。使用生成器(yield),您可以編寫同步代碼。在任何情況下,當你走異步都沒有回頭路時,你基本上陷入了異步世界。 – elclanrs
事件監聽器是**不**同步調用。 –