node.js - Return q resolve when all operations complete -


i have function want resolve when foreach has completed.. im using q, , mongoose capitalised things refer to, , want create set of items first, run function after foreach complete.

function createitems() {    var deferred = q.defer();    var itemsarray = [{ 'name' : 'spade' }, { 'name' : 'bucket' } , { 'name' : 'sand'}];    itemsarray.foreach(function(itemobj) {     var item = new item(itemobj); // forces use schema (dont worry)     item.findoneandupdate({       url: item.short_name     }, item, {       upsert: true     }, function(err) {       if (!err) {         console.log(item.name + ' created.');         deferred.resolve();       } else {         deferred.reject(new error(err));       }     });   });     return deferred.promise; }  createitems()     .then(function() {       console.log('all items done.');     }); 

so expect see on console like;

spade item created bucket item created sand item created items done.

quick aside: array has syntax issue, contains 1 object multiple attempts write name. assumed intended have array of objects, each name.

basically, approach fails because resolving promise on first instance. want promise represents multiple async calls completing. standard way pass array of promises library function q.all / bluebird.all / promise.all. all function takes array of promises , returns promise array of results. resolves when promises resolve, or rejects when 1 of promises reject.

function createitems() {    var promisesforupdateddocs = [];    var itemsarray = [     { name: 'spade'},     { name: 'bucket'},     { name: 'sand'}   ];    itemsarray.foreach(function(itemobj) {     var item = new item(itemobj);     var updateddocpromise = item.findoneandupdate({       url: item.short_name     }, item, {       upsert: true     }).exec(); // returns mpromise     promisesforupdateddocs.push(q(updateddocpromise)); // using q turn mpromise q promise, , adding array   });    return q.all(promisesforupdateddocs); // creates promise array of results (from array of promises) }  createitems()   .then(function(items) {     console.log('all items done:', items);   }).catch(console.log); // never forget handle errors! `return` or `catch` promise chain. 

Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -