2016-06-29 30 views
1

データベースレベルでデータを更新する1つの再帰クエリを作成しました。node.jsの非同期関数の再帰呼び出し

私はこのコードを書かれている:

let updateInvitationRewards = function(parent, level, callback) { 

    Service.customer.getOneCustomer({ 
    _id: parent 
    }, {}, {}, function(err, data) { 

    console.log(data.email); 
    level--; 
    if (data.parent) { 
     parent = data.parent.id; 
    } else if (level == 0 || data.parent == null) 
     callback("end"); 

    updateInvitationRewards(parent, level--, callback); 
    }); 

}; 

updateInvitationRewards(parent, level, function(string) { 
    console.log(string); 
    cb(); 
}); 

このクエリは、このようなエラーを与えている:

Error: Callback was already called. 

私はコールバックのこれらの種類に新しいです、私を助けてください。すべてのブラケット付き

+0

'if(data.parent)'の中に 'updateInvitationRewards(parent、level--、callback);'を挿入できますか? –

+0

データの明瞭さのためにコードのこの部分から挿入コードを削除しませんでした...しかし、このコードの多くはエラーを出しています...コールバックは既に呼び出されていました..私はそれを取得していません.. –

+0

コールバック機能は複数回使用されます。あなたのコードで、レベルが0になったり、parentがnullの場合は、コールバックが呼び出されます。しかし、else if条件が満たされていても、あなたのコードは引き続きudpateInvitationRewardsを呼び出すでしょう。親がnullの次回までにコールバックが2回目に呼び出されます。これによりエラーが発生する可能性があります。 –

答えて

2

、我々は持っている:

if (data.parent) { 
    parent = data.parent.id; 
} else if (level == 0 || data.parent == null) { 
    callback("end"); 
} 

updateInvitationRewards(parent, level--, callback); 

levelが0またはdata.parent nullのに等しい場合、コールバックは、その後、トリガ、同じコールバックを持つupdateInvitationRewardsです。

それを修正するには、次のコールバックは、一度だけ呼ばれるべき任意の関数で

if (data.parent) { 
    parent = data.parent.id; 
} else if (level == 0 || data.parent == null) { 
    return callback("end"); // the execution stops here 
} 

updateInvitationRewards(parent, level--, callback); 
+0

ありがとうございます。 –

1

を。コールバックが複数回呼び出された場合、Error: Callback was already called.が来るでしょう。

コードサンプルから、関数が再帰的に呼び出されることがわかります。したがって、レベルが0になるか、親がnullのときにエラーが表示される可能性があります。

次のシナリオを考えてください。レベルがnullの場合、またはコールバックが初めて呼び出されるときに親がnullの場合。しかし、再帰呼び出しは引き続き発生します。次回の実行で、親がnullの場合、2回目にコールバックが呼び出され、エラーがスローされます。

レベルからの使用方法はわかりませんでしたが、次のコードを実装することをお勧めします。これにより、コールバックが次回呼び出されないことが保証されます。

let updateInvitationRewards = function(parent, level, callback) { 

    Service.customer.getOneCustomer({ 
     _id: parent 
    }, {}, {}, function(err, data) { 
     console.log(data.email); 
     level--; 
     if (data.parent) { 
      parent = data.parent.id; 
      updateInvitationRewards(parent, level--, callback); 
     } else if (level == 0 || data.parent == null) 
      callback("end"); 
    }); 
}; 

updateInvitationRewards(parent, level, function(string) { 
    console.log(string); 
    cb(); 
}); 
関連する問題