Kenny Ki
Kenny Ki

Reputation: 3430

Node.js: Better way to process a result composed from asynchronous callbacks

In my node.js app, I have a code snipplet to compose a csv array:

function process(alerts, callback) {
    var csvList = [];
    var alertsLength = alerts.length;

    alerts.forEach(function(alert) {
        var name = alert.name;
        var msg = alert.msg;

        // retrieve from database
        // NOTE: the asynchronous part!
        PersonDao.getContact(name, function(error, contact) {
            var csv = "csv:" + contact + "|" + msg;
            csvList.push(csv);

            if (csvList.length == alertsLength) {
                // execute callback with the csvList
                callback(csvList);
            }
        });

    }); // end of alerts loop

}

Is there any more elegant (or correct) way to do this?

Upvotes: 0

Views: 112

Answers (1)

alex
alex

Reputation: 12265

Just use 3rd party libraries for that.

var async = require('async');

function process(alerts, callback) {
    //       v--- or async.map(...) to do it in parallel
    async.mapSeries(alerts, function(alert, cb) {
        PersonDao.getContact(alert.name, function(error, contact) {
            cb(error, "csv:" + contact + "|" + alert.msg);
        });
    }, callback);
}

Upvotes: 1

Related Questions