Node.js 正确完成NodeJS中forEach内部的异步操作
我想在我的购物车构建过程中添加一个验证功能。这个验证函数可以接收一个数组,对于每个迭代,在数据库中签入一些值 这是密码Node.js 正确完成NodeJS中forEach内部的异步操作,node.js,asynchronous,foreach,Node.js,Asynchronous,Foreach,我想在我的购物车构建过程中添加一个验证功能。这个验证函数可以接收一个数组,对于每个迭代,在数据库中签入一些值 这是密码 async.map(eventPricings, function(priceItem, done) { var eventPricing = new EventPricing(priceItem); eventPricing.find(false, function(err, eventPricingFound) { if(err) {
async.map(eventPricings, function(priceItem, done) {
var eventPricing = new EventPricing(priceItem);
eventPricing.find(false, function(err, eventPricingFound) {
if(err) {
result.success = false;
result.errors.push("The EventPricing identifier : '"+eventPricing.id+"' does not exist");
} else {
if(priceItem.quantity > eventPricingFound.quantityPerUser) {
result.success = false;
result.errors.push("Quantity exceed per user for eventPricing identifier "+eventPricing.id);
}
else result.pendingTickets.push({quantity:priceItem.quantity, eventPricingId:eventPricingFound.id, price:eventPricingFound.price});
}
i++;
if(i == eventPricingsCount) done(result);
});
}, function(resultArray) { /* Some stuff here */ });
find方法是一个异步函数,用于从服务器端获取资源。在这个函数的回调中,我正在进行测试,如果测试通过,我将在数组中添加eventPricing
如果我想回顾这部分代码,以承诺为导向,特别是我想删除最后两行代码,这两行代码允许取消阻止正在运行的进程
i++;
if(i == eventPricingsCount) done(result);
你有什么想法吗
我目前正在将Q用于其他函数,但我不知道如何处理这种特殊情况
非常感谢那是异步模块吗?看起来您没有正确使用异步。您不需要保留自己的迭代器,每次都应该在某个地方调用done。否则,您将永远无法获得结果数组。回调还需要functionerr,result。无论如何,有一个模块可以满足您的需求:
对不起,没有回答 我所做的是将代码外部化到一个返回承诺的函数中:
eventPricingsValidationService.isEventPricingValid = function(eventPricing, options) {
return models.eventPricing.find({where: {id: eventPricing.id}, {lang:options.lang})
.then(function(ep) {
if (!ep) throw BEV.errorHandler({codeHttp: 404 , type: 'invalidEventPricing'});
var quantity = ep.pendings.length;
if ( quantity > ep.quantityPerUser ) {
throw ("Quantity exceed per user for eventPricing identifier " + eventPricing.id);
}
return ep;
}).catch(function(error) {
throw BEV.errorHandler(error);
});
});
然后,使用Q Library和Q.all方法,如等待所有承诺在继续之前得到解决:
_.forEach(eventPricings, function(eventPricing) {
promises.push(_this.isEventPricingValid({id:eventPricing.id}, options));
});
Q.all(promises)
.then(function (results) {
// Some code here
});
谢谢@Timothy,很抱歉没有回答。我已更新我的答案并标记为已解决。你认为这样做有效吗?