简体   繁体   中英

Respond to request after all data is inserted to database

I am trying to implement multiple data insertion on one call and trigger response only after all data is inserted. This is how I am currently doing it:

create: function(req, res) {
    var response = {};
    var num = req.body.num;
    var ret = 0;

    for (var i = 0; i < num; i++) {
        var db = new user();

        db.enabled =  false;
        db.save(function(err){
            if(err) {
              // Handle error
            } else {
              ret++;
              // Do something
            }
        });
    }

    response = {"status" : 200, "message" : "It's working: " + ret};
    res.json(response);
}

The problem with this approach is that all the callbacks for save will be triggered after res.json(response) which is wrong because sometimes I would also like to inform user how much data was saved. User will always receive the following response:

It's working: 0

Because ret variable is always 0. It's getting increased only after response is already triggered. What am I doing wrong?

EDIT:

Code after Will's suggestion:

var Q = require('q');

create: function(req, res) {
    var response = {};
    var num = req.body.num;
    var ret = 0;
    var tasks = [];

    for (var i = 0; i < num; i++) {
        var db = new user();

        db.enabled =  false;

        tasks.push(db.save());
    }

    Q.all(tasks).then(
        function(results) { 
          response = {"status" : 200, "message" : "It's working!"}; 
        }, 
        function(err) { 
          response = {"status" : 500, "message" : "Not working!" };
        );

    res.json(response);
}
for (var i = 0; i < num; i++) {
        var db = new user();

        db.enabled =  false;
        db.save(function(err){
            if(err) {
              // Handle error
            } else {
              ret++;
              if(ret == num){
                response = {"status" : 200, "message" : "It's working: " + ret};
                res.json(response);
              }
            }
        });
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM