0

I'm not that experienced with node js yet , but i'm learning.

So my issue. Example: I have a small app with mongoose and async modules. In mongodb in a user collection i have 1 user with a field balance = 100 .

var arr     = [1,2,3,4];
var userId  = 1;
async.forEachSeries(arr, (item, cb) =>{
    async.waterfall([
        next => {
            users.findById(userId, (err, user) =>{
                if (err) throw err;
                next(null, user)
            });
        },
        (userResult,next) =>{
            var newBalance = userResult.balance - item;
            users.findByIdAndUpdate(userId, {balance:newBalance}, err =>{
                if (err) throw err;
                next(null, userResult, newBalance);
            })
        }

    ],(err, userResult, newBalance) =>{
        console.log(`Old user balance: ${userResult.balance} New user balance: ${newBalance}`);
    });
    cb(null)
});

And i'm receiving such result

Old user balance: 100 New user balance: 98
Old user balance: 100 New user balance: 99
Old user balance: 100 New user balance: 97
Old user balance: 100 New user balance: 96

So basically foreach asynchronously is invoking async.waterfall . My question how to do foreach Synchronously item by item, i have tried each, forEach, eachSeries , with and without Promises. Need to get such result at the end

Old user balance: 100 New user balance: 99
Old user balance: 99 New user balance: 97
Old user balance: 97 New user balance: 94
Old user balance: 94 New user balance: 90

Thank You

1 Answer 1

1

The problem is where the final callback got called. You need to call cb() inside of waterfall's final callback, not outside:

var arr     = [1,2,3,4];
var userId  = 1;
async.forEachSeries(arr, (item, cb) =>{
  async.waterfall([
    next => {
        users.findById(userId, (err, user) =>{
            if (err) throw err;
            next(null, user)
        });
    },
    (userResult,next) =>{
        var newBalance = userResult.balance - item;
        users.findByIdAndUpdate(userId, {balance:newBalance}, err =>{
            if (err) throw err;
            next(null, userResult, newBalance);
        })
    }

],(err, userResult, newBalance) =>{
    console.log(`Old user balance: ${userResult.balance} New user balance: ${newBalance}`);
    cb(null);   // <<==== call here
});
// cb(null);   // <<==== NOT call here

});

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.