Позвольте мне начать с того, что я очень новичок в Node и, возможно, допустил ошибку проектирования, но я не смог найти лучшего способа сделать то, что я хочу.
У меня есть функция, которая должна перебирать массив, и для каждого элемента в массиве ей нужно выполнять некоторую асинхронную работу.
Я не хочу, чтобы вызывающая функция выполнялась до тех пор, пока не будут обработаны все элементы в массиве, поэтому я обернул свою функцию обещанием, которое разрешается только после завершения работы над всеми элементами.
Я использую eventEmitter внутри моей функции, чтобы сигнализировать, когда эта работа над 1 элементом завершена, и теперь мы можем начать работу над следующим элементом.
Когда все элементы обработаны array.length==0
, то обещание разрешено.
Проблема, с которой я сталкиваюсь, заключается в том, что мой прослушиватель событий находится внутри функции и создается каждый раз, когда функция запускается. С другой стороны, я не могу поместить его вне функции, потому что тогда я не смогу выполнить обещание для своей функции.
Может ли кто-нибудь помочь мне понять, как избежать создания ненужных слушателей и поддерживать работу моей функции?
Я пытался использовать .once()
вместо .on()
при создании слушателя. Вроде проблему не решило...
function myFunc(objectToTest, testArray) {
return new Promise(function (resolve, reject) {
var array = [];
for (let i = 0 ; i < testArray.length ; i++){
if (objectToTest.name == testArray[i].name){
array.push(testArray[i]);
}
}
eventEmitter.on('done-with-async-work', processArray);
eventEmitter.emit('done-with-async-work')
function processArray() {
if (array.length > 0) {
let itemInArray = array.shift();
// some Async function
auxFunc.asyncFunc(itemInArray).then(function (asyncResult)){
// Triggered when asyncFunc promise is resolved
eventEmitter.emit('done-with-async-work')
}
} else {
console.log("Finished With All Async work!");
resolve("Done with work!")
}
}
});
}
asyncFunc
опирается на предыдущий результат, например водопад, или вы можете просто запустить все асинхронные операции одновременно и использоватьPromise.all
, чтобы увидеть, когда они все сделано. - person adeneo   schedule 16.10.2016Promise.all
- person Curtwagner1984   schedule 16.10.2016emit
прямыми вызовамиprocessArray
- и вы действительно должны сделать это. - person Bergi   schedule 16.10.2016processArray
. Кроме того, я беспокоюсь о создании дополнительных слушателей не из-за их стоимости, а потому, что они не уничтожаются, когда функция существует, так что это потенциальная утечка памяти. - person Curtwagner1984   schedule 17.10.2016emit
. Особенно те, что в обратном вызовеasyncFunc
. - person Bergi   schedule 17.10.2016