2017-01-18 15 views
1

settopending(f、fb)が最初に呼び出される関数です。applytransaction(t、f、fb)が呼び出されないため、コールバックを正しく記述しなかったかどうかはわかりません。 "First"と "Second"が印刷されますが、 "Third"と "Fourth"は印刷されません。私は間違ってapplytransaction(t、f、fb)を呼び出すはずのコールバックを設定したのか、それとも問題があるのでしょうか?純粋な推測としてNode.JSコールバック関数が実行されていません

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 } } 
) 

} 
+0

'機能更新(文書、F、FB)が' - コールバック引数宣言も-alsoと呼ばれる任意のコールバック、 'F'はありませんと' fb'は決して使用されません! ... 'this.transactions.update'はコールバックパラメータを受け入れますか? –

答えて

1

ffbを更新

によって必要とされないように
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); 
     }); 
    }); 
} 

0
function update(document,f,fb, callback) 
{ 

this.transactions.update(
    { _id: document._id, state: "initial" }, 
    { 
     $set: {state: "pending"}, 
     $currentDate: {lastModified: true} 
    }, 
    callback(); 

); 
console.log("Second") 

} 
より理にかなって、ものの this.transactions.updateコールバック

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") 
} 

を受け入れる場合

この関数でもcallbackパラメータを設定し、トランザクションが完了したらcallback()を送信する必要があります。

1

問題は更新方法にあります。 fb(どこでもコールバックメソッド)を呼び出すわけではありません。この操作 "this.transactions.update"の後、メソッドは渡されたコールバック関数を呼び出すことなく乗り越えます。

その後に関数呼び出しを追加します。 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") 

} 

この「this.transactions.update」は、ほとんどがcallabckメソッドも期待しています。あなたは以下のようにそこにあなたのロジックを配置する必要があります。

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") 

}

+0

@Aaronこれで問題が解決した場合はお知らせください。 –

関連する問題