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
Post a Comment