settopending(f,fb) es la primera función llamada, no estoy seguro si no escribí las devoluciones de llamada correctamente porque applytransaction(t,f,fb) nunca se llama. Se imprime "Primero" y "Segundo", pero no se imprimen "Tercero" y "Cuarto". ¿Configuré incorrectamente la devolución de llamada que se supone que debe llamar a applytransaction(t,f,fb) o hay algo más que sea el problema?
function update(document,f,fb) { this.transactions.update( { _id: document._id, state: "initial" }, { $set: {state: "pending"}, $currentDate: {lastModified: true} } ); console.log("Second") } function settopending(f,fb) { console.log("First"); var t = this.transactions.findOne( { state: "initial" } , function(err, document) {//CALLBACK update(document,f,fb , function(err, document) {//CALLBACK console.log("Third"); applytransaction(document,f,fb); }); }); } function applytransaction(t,f,fb) { console.log("Fourth"); x=fb(t.value); y=f(t.value); this.model.update( { _id: t.source, pendingTransactions: { $ne: t._id } }, { $inc: { bal:x }, $push: { pendingTransactions: t._id } } ); this.model.update( { _id: t.destination, pendingTransactions: { $ne: t._id } }, { $inc: { bal: y }, $push: { pendingTransactions: t._id } } ) }como pura suposición, si this.transactions.update acepta una devolución de llamada
function update(document, f, fb, cb) { // added cb parameter this.transactions.update({ _id: document._id, state: "initial" }, { $set: {state: "pending"}, $currentDate: {lastModified: true} }, cb // added cb argument ); console.log("Second") } aunque, como f y fb no son necesarios para la actualización
function update(document, cb) { this.transactions.update({ _id: document._id, state: "initial" }, { $set: {state: "pending"}, $currentDate: {lastModified: true} }, cb ); console.log("Second") } function settopending(f,fb) { console.log("First"); var t = this.transactions.findOne( { state: "initial" } , function(err, document) {//CALLBACK update(document, function(err, document) {//CALLBACK console.log("Third"); applytransaction(document,f,fb); }); }); }tiene más sentido
El problema es con su método de actualización. No está llamando al fb (método de devolución de llamada en cualquier lugar). después de esta operación "this.transactions.update", el método se supera sin llamar a la función de devolución de llamada pasada.
agregue una llamada de función después de eso: fb(err,document);
function update(document,f,fb) { this.transactions.update( { _id: document._id, state: "initial" }, { $set: {state: "pending"}, $currentDate: {lastModified: true} } ); console.log("Second") }En su mayoría, este "this.transactions.update" también esperaría un método callabck. Necesitas poner tu lógica allí como a continuación:
function update(document,f,fb){ this.transactions.update( { _id: document._id, state: "initial" }, { $set: {state: "pending"}, $currentDate: {lastModified: true} },function(err,doc){ if(err){ fb(err,null) }else{ fb(null,doc) } } ); console.log("Second")}
function update(document,f,fb, callback) { this.transactions.update( { _id: document._id, state: "initial" }, { $set: {state: "pending"}, $currentDate: {lastModified: true} }, callback(); ); console.log("Second") }También debe tener el parámetro de devolución de llamada en esta función y luego enviar la devolución de llamada () cuando finalice la transacción.