Javascript 在内部嵌套回调函数中调用的对象未定义

Javascript 在内部嵌套回调函数中调用的对象未定义,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,“First”与正常打印的对象t一起打印,但输入回调后的回调“Second”与未定义的对象t一起打印。在applied(t)函数中,由于对象t由于某种原因在此时未定义,因此导致错误-TypeError:无法读取未定义的属性'\u id'。如果在进入这个回调函数之前没有定义它,那么会是什么原因呢?update()是一个MongoDB函数 function applied(t) { this.transactions.update( { _id: t._id, sta

“First”与正常打印的对象t一起打印,但输入回调后的回调“Second”与未定义的对象t一起打印。在applied(t)函数中,由于对象t由于某种原因在此时未定义,因此导致错误-TypeError:无法读取未定义的属性'\u id'。如果在进入这个回调函数之前没有定义它,那么会是什么原因呢?update()是一个MongoDB函数

function applied(t)
{
    this.transactions.update(
    {
        _id: t._id, state: "pending" },
    {
        $set: { state: "applied" },
        $currentDate: { lastModified: true }
    }
)
}

function applytransaction(t,f,fb)
{

    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 } }
    , function(err,t,y) {
        console.log("First "+t);
        this.model.update(
            { _id: t.destination, pendingTransactions: { $ne: t._id } },
            { $inc: { bal: y }, $push: { pendingTransactions: t._id } }
         , function(err, t) {
             console.log("Second " +t);
            applied(t);
        });

    });


}
由于某种原因,对象t此时未定义。如果在进入这个回调函数之前没有定义它,那么会是什么原因呢?update()是一个MongoDB函数

function applied(t)
{
    this.transactions.update(
    {
        _id: t._id, state: "pending" },
    {
        $set: { state: "applied" },
        $currentDate: { lastModified: true }
    }
)
}

function applytransaction(t,f,fb)
{

    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 } }
    , function(err,t,y) {
        console.log("First "+t);
        this.model.update(
            { _id: t.destination, pendingTransactions: { $ne: t._id } },
            { $inc: { bal: y }, $push: { pendingTransactions: t._id } }
         , function(err, t) {
             console.log("Second " +t);
            applied(t);
        });

    });


}
原因是第一次回调(和第二次回调)中的
t
与第一次
t
不同。给他们唯一的名字,检查错误,你应该找出问题所在

根据您的评论进行更新:如果您想在整个函数中使用原始的
t
,那么只需使用它即可。不要期望它以某种方式来自回调参数,因为传递给回调的第二个值是更新的记录数,而不是
t
是多少

function applytransaction(t, f, fb)
{
    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 } },
        function(err1, count1, status1) {
            console.log("First err:", err1);
            console.log("First ", t);

            this.model.update(
                { _id: t.destination, pendingTransactions: { $ne: t._id } },
                { $inc: { bal: y }, $push: { pendingTransactions: t._id } },
                function(err2, count2) {
                    console.log("Second err", err2);
                    console.log("Second ", t);

                    applied(t);
                }
            );
        }
    );
}

名为
t
的变量太多。给他们唯一的名字。因此,停止使用1个字母和2个字母的变量名,并为所有变量指定有意义的名称。因此,第二次更新失败,显然
t
不是您所认为的那样。不过,我正在尝试使用对象t作为第二个回调函数的参数。如果我创建一个参数t2,那么我将无法从t获得所需的数据。@AaronReich更新了我的答案。