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,很抱歉没有回答。我已更新我的答案并标记为已解决。你认为这样做有效吗?