首先让我说我是 Node 的新手,可能犯了设计错误,但我想不出更好的方法来做我想做的事情。
我有一个函数需要遍历一个数组,并且它需要为数组中的每个元素做一些异步工作。
我不希望函数的调用者在处理完数组中的所有元素之前继续执行,因此我将我的函数包装在一个 Promise 中,该 Promise 仅在所有元素的工作完成时才解析。
我在我的函数内部使用了 eventEmitter,以便在 1 个元素的工作完成时发出信号,现在我们可以开始处理下一个元素。
当所有元素都被处理 array.length==0
并且 promise 被解决。
我遇到的问题是我的事件监听器在函数内部,并且在每次函数运行时创建。另一方面,我不能将它放在函数之外,因为那样我将无法为我的函数解析 promise。
谁能帮我弄清楚如何避免创建不必要的监听器并保持我的功能正常运行?
我在创建监听器时尝试使用 .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!")
}
}
});
}
最佳答案
Promise.all,如果你想同时做多件事,它非常有用。如果您想以线性方式做事,您可以将 promise 链接起来。
所以我可以做一个片段,我刚刚做了一个假设的异步函数,它的值是 sqr,然后我在最后把它们全部加起来。
你也可以做更高级的版本,例如。 Bluebird Promises 具有具有并发选项的映射函数。
var somethings = [12,1,33,23,44,22,11,32,12,44,22,32];
function asyncSqr(v) {
return new Promise(function (resolve, reject) {
setTimeout(function () { resolve(v*v); }, 200);
});
}
function myFunc(a) {
var sum = 0;
return new Promise(function (resolve, reject) {
function doNext() {
var next = a.shift();
if (!next) return resolve(sum);
console.log('sending: ' + next);
return asyncSqr(next).then(function (r) { sum += r; doNext(); });
}
doNext();
});
}
myFunc(somethings).then(function (r) {
console.log('result: ' + r);
});
关于javascript - 如何使用 nodeJS 中的 eventEmitter 从外部解决 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074676/