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