javascript - Breaking down Callback Hell how do I pass a value? -


using monoskin in express route i'm doing following:

router.get(/getbuyerinfo, function(req, res) {      var data = "data";      db.collection('buyerrec').find().toarray(function(err, result) {         if (err) throw err;         console.log(result);          db.collection('buyerhistory').find().toarray(function(err, result) {             if (err) throw err;             console.log(result);             console.log(data);         });     }); });    

it's deeper. in attempt clean deep callbacks, in straight forward , quickest manner, if not modern way, created:

router.get(/getbuyerinfo, getbuyerrec);  function getbuyerrec(req, res) {     var data = "data";      db.collection('buyerrec').find().toarray(getbuyerhistory); }  function getbuyerhistory(err, result) {     if (err) throw err;     console.log(result);      db.collection('buyerhistory').find().toarray(function(err, result) {         if (err) throw err;         console.log(result);         console.log(data);     }); } 

my problem 'data' no longer in scope. 'data' value came express router.get(). how pass 'data' getbuyerhistory function can use it?

assuming have along lines of:

(function () {   var data = "data";    db.collection('buyerrec').find().toarray(getbuyerhistory); }());  function getbuyerhistory(err, result) {     if (err) throw err;     console.log(result);      db.collection('buyerhistory').find().toarray(function(err, result) {         if (err) throw err;         console.log(result);         console.log(data);     }); }); 

you can create function returns function, , pass data in parameter:

function factory(data) {   return function getbuyerhistory(err, result) {     ...   }; } 

which can call create function pass toarray:

(function () {   var data = "data";    db.collection('buyerrec').find().toarray(factory(data)); }()); 

alternatively, if you're not otherwise using this within getbuyerhistory, bind data context , pass bound function toarray:

(function () {   var data = "data";    db.collection('buyerrec').find().toarray(getbuyerhistory.bind(data)); }()); 

alternatively, @bergi correctly pointed out, can add parameter getbuyerhistory , use bind without context:

(function () {   var data = "data";    db.collection('buyerrec').find().toarray(getbuyerhistory.bind(null, data)); }());  function getbuyerhistory(data, err, result) {     ... } 

Comments

Popular posts from this blog

html - Styling progress bar with inline style -

java - Oracle Sql developer error: could not install some modules -

How to use autoclose brackets in Jupyter notebook? -