Saturday 20 May 2017

Promises not waiting for each other in my nodejs controller

I got 4 promises here, and I thought that it would run the first one, then wait until its finished, THEN run the next one, wait till finished and THEN run the next one etc..

But what happens here is that it runs all of them all at once and does not wait for anything to finish.

This is my promise chain:

// 
// Run the promises
// 
findBanks
    .then(findReceipts)
    .then(findExpenses)
    .then(sendResult)
    .catch(err => {
        console.error(err);
        console.log("getbankAccountReport ERR: " + err);
        res.json({error:true,err})
    });

This is the output from my console.log

=====findAllBank=====
=====findAllReceipt=====
=====findAllExpense=====
=====RESOLVE findAllBank=====
=====sendResult=====
=====RESOLVE sendResult=====
=====RESOLVE findAllReceipt=====
=====RESOLVE findAllExpense=====

Am I not understanding promises correct or?

Anyway here is my nodejs controller:

    exports.getBankAccountReport = function(req, res) {

        // 
        // Find all bank accounts
        // 
        var bankModel = require('../models/bankModel');
        var bankTable = mongoose.model('bankModel');
        var bankArray = [];
        var findAllBank = new Promise(
            (resolve, reject) => {
            console.log("=====findAllBank=====")
            bankTable.aggregate([
                ...lots of mongo stuff...
                ],function(err, data) {
                if (!err) {
                    bankArray = data;
                    console.log("=====RESOLVE findAllBank=====")
                    resolve(data);
                } else {
                    reject(new Error('findBank ERROR : ' + err));
                }
            });
        });


        // 
        // Find the RECEIPT for each bank account
        // 
        var receiptModel = require('../models/receiptModel');
        var receiptTable = mongoose.model('receiptModel');
        var receiptArray = [];
        var findAllReceipt = new Promise(
            (resolve, reject) => {
            console.log("=====findAllReceipt=====")
            receiptTable.aggregate([
                ...lots of mongo stuff...
                ], function (err, data) {
                    if (!err) {
                        receiptArray = data;
                        console.log("=====RESOLVE findAllReceipt=====")
                        resolve(data);
                    } else {
                        reject(new Error('findReceipts ERROR : ' + err));
                    }
            });
        });


        // 
        // Find the EXPENSE for each bank account
        // 
        var expenseModel = require('../models/expenseModel');
        var expenseTable = mongoose.model('expenseModel');
        var expenseArray = [];
        var findAllExpense = new Promise(
            (resolve, reject) => {
            console.log("=====findAllExpense=====")
            expenseTable.aggregate([
                ...lots of mongo stuff...
                ], function (err, data) {
                    if (!err) {
                        expenseArray = data;
                        console.log("=====RESOLVE findAllExpense=====")
                        resolve(data);
                    } else {
                        reject(new Error('findExpense ERROR : ' + err));
                    }
            });
        });

        var sendResult = function(data) {
            var promise = new Promise(function(resolve, reject){
                console.log("=====sendResult=====")
                res.json({error:false,  
                          "bank":bankArray, 
                          "receipt":receiptArray, 
                          "expense":expenseArray})
                console.log("=====RESOLVE sendResult=====")
                resolve();
            });
            return promise;
        };

    // 
    // Run the promises
    // 
    findAllBank
        .then(findAllReceipt)
        .then(findAllExpense)
        .then(sendResult)
        .catch(err => {
            console.error(err);
            console.log("getbankAccountReport ERR: " + err);
            res.json({error:true,err})
        });
}



via torbenrudgaard

No comments:

Post a Comment