gpt4 book ai didi

javascript - 为什么循环中的node.js中的异步给出错误

转载 作者:IT王子 更新时间:2023-10-29 06:09:20 25 4
gpt4 key购买 nike

我的应用程序中有这部分代码。

 card.getcard(command, function(toproceed,resultscard) {
console.log('entry other cards api result'+sys.inspect(resultscard));
if (resultscard.length==0) {
return proceed(false,{errno:'011','queueno' : request.queueno, message:'there is no access card for particular gib'});
}

for (var i=0; i<resultscard.length;i++) {
console.log('card owner'+resultscard[i].owner);

//checking that any users is in inside of gib
server.wrap(function(){
server.getchannel("channels."+request.gibid+'-I', function(err, channel) {
if (channel.users) {
var arr=channel.users.split(',');
if (functions.in_array(resultscard[i].owner, arr)) {
response.users.push(resultscard[i].owner);
}
}
});
if(i==resultscard.length-1) {
if (response.users.length<=0) {
//here need to send sorry event that no owner is online
request._command='sorry';
} else {
request._command='knock';
}
return proceed(true,response);
}
});

}
});

执行此操作时出现错误。

entry other cards api result[ { cardid: 16,
cardtype: 'A',
status: 'A',
refername: 'rahulgib',
refertype: 'G',
owner: 'rahul' },
{ cardid: 27,
cardtype: 'A',
status: 'A',
refername: 'rahulgib',
refertype: 'G',
owner: 'namita' } ]
card ownerrahul
card ownernamita

node.js:178
throw e; // process.nextTick error, or 'error' event on first tick
^
TypeError: Cannot read property 'owner' of undefined
at Object.callback (/home/myhome directory /redisyoungib/lib/yapi.js:271:50)
at RedisClient.return_reply (/usr/local/lib/node/.npm/redis/0.6.0/package/index.js:384:29)
at HiredisReplyParser.<anonymous> (/usr/local/lib/node/.npm/redis/0.6.0/package/index.js:78:14)
at HiredisReplyParser.emit (events.js:64:17)
at HiredisReplyParser.execute (/usr/local/lib/node/.npm/redis/0.6.0/package/lib/parser/hiredis.js:35:22)
at RedisClient.on_data (/usr/local/lib/node/.npm/redis/0.6.0/package/index.js:325:27)
at Socket.<anonymous> (/usr/local/lib/node/.npm/redis/0.6.0/package/index.js:90:14)
at Socket.emit (events.js:64:17)
at Socket._onReadable (net.js:673:14)
at IOWatcher.onReadable [as callback] (net.js:177:10)

我不明白为什么会出现此错误?

get card 给出card的mysql结果

wrap函数执行了回调函数。

getchannel 从redis 返回数据。

最佳答案

您创建并传递给 server.getchannel 的函数是 i 变量的闭包(好吧,范围内的所有内容,但它是 i 我们关心的)。他们获得了对 i持久引用,而不是函数创建时其值的副本。这意味着当函数运行时,它使用 i当前值,而不是创建函数时的值。结果是 所有 这些函数将使用相同的 i 值,这是循环结束时的值。由于它超出了数组的末尾,resultscard[i]undefined,因此尝试从中读取 owner 属性失败。 (有关闭包的更多信息:Closures are not complicated)

因此,您要做的是让这些函数关闭 i 值的副本。这样做的通常方法是使用一个工厂函数来创建它们并接受要用作参数的值。工厂函数创建回调函数,它关闭参数,其值不会改变。

如果不仔细阅读它,将其应用到您的代码中可能看起来像这样:

card.getcard(command, function(toproceed,resultscard) {
console.log('entry other cards api result'+sys.inspect(resultscard));
if (resultscard.length==0) {
return proceed(false,{errno:'011','queueno' : request.queueno, message:'there is no access card for particular gib'});
}

for (var i=0; i<resultscard.length;i++) {
console.log('card owner'+resultscard[i].owner);

//checking that any users is in inside of gib
server.wrap(function(){
server.getchannel("channels."+request.gibid+'-I', makeCallback(i));
// Call the factory function, passing in `i` -----^
if(i==resultscard.length-1) {
if (response.users.length<=0) {
//here need to send sorry event that no owner is online
request._command='sorry';
} else {
request._command='knock';
}
return proceed(true,response);
}
});

}

// The factory function
function makeCallback(index) {
return function(err, channel) {
if (channel.users) {
var arr=channel.users.split(',');
// Note we use `index` -- our argument -- not `i` below
if (functions.in_array(resultscard[index].owner, arr)) {
response.users.push(resultscard[index].owner);
}
}
};
}
});

现在我们在 makeCallback 中创建的回调关闭了创建它的调用的 index 参数,没有其他改变。我们将 i 传入,然后就到了。它仍然是其他事物的闭包(因为 makeCallback 的定义位置),但它使用 index 来处理正确的条目。

关于javascript - 为什么循环中的node.js中的异步给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6249750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com