How to optimize this Node.js + q code to prevent callback hell? -



How to optimize this Node.js + q code to prevent callback hell? -

i using q prevent callback hell have reached part of code don't know how arrange:

i searching scheduled messages delivered. each of them, seek send them 1 1 , if sent, removes database. ugly part have then() within loop. way end having nested promises instead of nested callbacks!!!! suggestions?

applog.debug("looking scheduled messages"); var messages = messageservice.findscheduled() .then(function(messages){ applog.debug("found [%d] stored messages",messages.length); for(var = 0; i<messages.length; i++){ messageservice.send(msg.namespace, msg.message, msg.data) .then(function(result) { if (result == constants.event_emit_sent) { applog.debug("message [%s] sent!!!", msg._id); messageservice.remove(msg._id) .then(function(result) { applog.debug("message deleted: [%s]", msg._id); }) .fail(function(err) { applog.error("the message couldn't deleted: [%s]", msg._id); }); }else if (result == constants.event_emit_not_sent_and_not_stored) { applog.debug("message [%s] not sent", msg._id); } }); } });

the ugly part have then() within loop

no, can happen. though functional programming style of promises leads using .map() callback anyway :-) looping command structure, , require nesting (except use exceptions command flow, i.e. branching). don't have nest promises in promise callbacks, though.

i'd simplify loop body to

function sendanddelete(msg) { homecoming messageservice.send(msg.namespace, msg.message, msg.data) .then(function(result) { if (result == constants.event_emit_sent) { applog.debug("message [%s] sent!!!", msg._id); homecoming msg._id; } else if (result == constants.event_emit_not_sent_and_not_stored) { applog.debug("message [%s] not sent", msg._id); throw new error("message not sent"); } }) .then(messageservice.remove) .then(function(result) { applog.debug("message deleted: [%s]", msg._id); }, function(err) { applog.error("the message has not been deleted: [%s]", msg._id); }); }

now can like

messageservice.findscheduled() .then(function(messages){ applog.debug("found [%d] stored messages",messages.length); homecoming q.all(messages.map(sendanddelete)); }) .then(function() { applog.debug("all messages done"); });

node.js callback promise q

Comments

Popular posts from this blog

xslt - DocBook 5 to PDF transform failing with error: "fo:flow" is missing child elements. Required content model: marker* -

mediawiki - How do I insert tables inside infoboxes on Wikia pages? -

Local Service User Logged into Windows -