Написание асинхронного кода событийно-ориентированным способом

Я программирую в node.js, иногда асинхронные функции становятся невероятно грязными. Я хочу написать асинхронный код, но получать данные по мере того, как происходит событие. Я знаю об обещаниях, но это не совсем то, что я хочу, просто то, что я прошу, примерно так

asyncFunc(error,dt,ld){
//some async code such as db operations
}

затем я хочу получить данные по событию

asyncFunc.on("dt",function(dt){do something});
asyncFunc.on("error",function(err){i have an error object});
asyncFunc.on("ld",function(ls){loading});

есть ли способ сделать это, я знаю обещания и некоторые сторонние библиотеки против ада обратного вызова, но мой вопрос особенно в том, что я написал, как я могу разработать свой код?


person nikoss    schedule 24.08.2015    source источник
comment
Вы можете сделать это, проверив свой асинхронный код для всех 3 ситуаций, когда ваш асинхронный код разрешается. Например, давайте представим, что вы делаете вызов ajax. Когда вызов возвращает данные (или ошибку), вам нужно будет проверить каждое событие, которое вы поддерживаете, и предупредить об этом своего посредника событий. Если он возвращает ошибку, инициируйте событие «ошибка», если он возвращает данные, инициируйте событие «dt» и т. Д. Лично я переключился на промисы после того, как мне надоело поддерживать согласованность состояния приложения с помощью нескольких вызовов событий.   -  person Shilly    schedule 24.08.2015
comment
как я вызову событие, я не уверен в этом, не могли бы вы написать ответ с примером, который я могу выбрать в качестве решения, тогда   -  person nikoss    schedule 24.08.2015
comment
Ответ ниже содержит хороший пример встроенного посредника узла.   -  person Shilly    schedule 24.08.2015


Ответы (1)


Используйте события nodejs

var asyncFunc = function(error,dt,ld){
    var events = require('events');
    var eventEmitter = new events.EventEmitter();

    //emit error
    eventEmitter.emit('error', new Error('some error'));
    //emit dt
    eventEmitter.emit('dt', 'some data for dt');
    //emit dld
    eventEmitter.emit('ld', {message: 'some details for ld', ld: ld});
    return eventEmitter;
}

//then
asyncFunc.on("dt",function(dt){/*do something*/});
asyncFunc.on("error",function(err){/*i have an error object*/});
asyncFunc.on("ld",function(ls){/*loading*/});

Отличная статья здесь
Официальный сайт nodejs документы событий

person Medet Tleukabiluly    schedule 24.08.2015
comment
это решение, которое я предполагаю, но все же есть некоторые вопросы :) как я могу вернуть несколько значений для одного события и могу ли я вернуть объект, например, для загрузки, пусть это будет загрузка файла что-то вроде on (ld, function (ожидаемый, полученный)) - person nikoss; 24.08.2015
comment
вы не можете вернуть несколько значений, но вы можете обернуть их в один объект. как в третьем выпуске я написал - person Medet Tleukabiluly; 24.08.2015