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