This below is my snippet code of sailsJS. This code is work on me.
afterCreate: function( value, callback ) {
var getStock = function( cb ) {
PurchaseInvoiceDetail
.find({ product: value.product.id })
.then(function( detail ) {
cb(null, SharedInvoiceService.sumNumberArray(_.pluck(detail, 'quantity')));
});
};
var updateStock = ['getStock', function( results, cb ) {
Product.findOne(value.product.id).then(function( product ) {
product.stock = results.getStock;
product.save(cb);
});
}];
async.auto({
getStock: getStock,
updateStock: updateStock
}, function( results ) {
console.log(results);
callback();
});
});
Then, I try to wrap that code for doing iteration like this
afterCreate: function( value, callback ) {
_.each(value.details, function(valueDetail) {
// wrapped
var getStock = function( cb ) {
PurchaseInvoiceDetail
.find({ product: valueDetail.product.id })
.then(function( detail ) {
cb(null, SharedInvoiceService.sumNumberArray(_.pluck(detail, 'quantity')));
});
};
var updateStock = ['getStock', function( results, cb ) {
Product.findOne(valueDetail.product.id).then(function( product ) {
product.stock = results.getStock;
product.save(cb);
});
}];
async.auto({
getStock: getStock,
updateStock: updateStock
}, function( results ) {
console.log(results);
callback();
});
// end-of-wrapped
});
});
And it doesn't work like I expected. So, how to operate each on async.auto?
UPDATE
Scott Gress' answer is more make sense and I've try it, but I got new problem because sometimes value.details
has no value. I modify my code like that.
beforeCreate: function( value, callback ) {
if (value.details) { // make sure value.details is defined
console.log('called');
async.each(value.details, function(valueDetail, eachCallback) {
// wrapped
var getStock = function( cb ) {
PurchaseInvoiceDetail
.find({ product: valueDetail.product.id })
.then(function( detail ) {
cb(null, SharedInvoiceService.sumNumberArray(_.pluck(detail, 'quantity')));
});
};
var updateStock = ['getStock', function( results, cb ) {
Product.findOne(valueDetail.product.id).then(function( product ) {
product.stock = results.getStock;
product.save(cb);
});
}];
async.auto({
getStock: getStock,
updateStock: updateStock
}, function( results ) {
console.log(results);
eachCallback();
});
// end-of-wrapped
}, callback);
} else {
console.log('skipped');
callback();
}
},
Now when I create a new data, I got this error at console.
called
C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_modules\sails\node_modules\wa
terline\lib\waterline\model\lib\defaultMethods\save.js:179
cb(null, data);
^
TypeError: object is not a function
at C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_modules\sails\node_mod
ules\waterline\lib\waterline\model\lib\defaultMethods\save.js:179:7
at bound (C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_modules\lodash\
dist\lodash.js:957:21)
at applyInOriginalCtx (C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_mo
dules\sails\node_modules\waterline\lib\waterline\utils\normalize.js:409:80)
at wrappedCallback (C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_modul
es\sails\node_modules\waterline\lib\waterline\utils\normalize.js:308:18)
at _normalizeCallback.callback.success (C:\Users\Ryan\Dropbox\Projects\ShopA
ppBackend\node_modules\sails\node_modules\waterline\node_modules\node-switchback
\lib\normalize.js:33:26)
at _switch (C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_modules\sails
\node_modules\waterline\node_modules\node-switchback\lib\factory.js:35:28)
at returnResults (C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_modules
\sails\node_modules\waterline\lib\waterline\query\finders\basic.js:166:9)
at C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_modules\sails\node_mod
ules\waterline\lib\waterline\query\finders\basic.js:136:9
at integrate (C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_modules\sai
ls\node_modules\waterline\lib\waterline\query\integrator\index.js:217:10)
at C:\Users\Ryan\Dropbox\Projects\ShopAppBackend\node_modules\sails\node_mod
ules\waterline\lib\waterline\query\finders\basic.js:87:7