[英]Node.JS Recursive Function Bad Variable
我有一个奇怪的问题,如果我对变量进行硬编码,我的代码就可以工作。 当代码设置变量时,我得到奇怪的结果。 但是,使用控制台日志,我可以看到该变量是正确的值。 我可以从字面上复制控制台值并将其粘贴到变量中,它将起作用。
function CheckInboxes (boxes, count=0) {
console.log('-----------------------------------------')
console.log('checking: ' + boxes[count] + ' | ' + count)
console.log('-----------------------------------------')
OpenInbox(boxes[count]).then(box => { //If I set this to 0 or any other value count would be, it works.
console.log('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^')
console.dir(box)
console.log('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^')
if(count < boxes.length -1) {
var test = count + 1
CheckInboxes(boxes, test) }
else
console.log('FINISHED<<<<<<<<<<<<<<<<<<<<<<<<<<')
})
}
boxes
是邮箱名称的数组,即“ inbox”,“ draft”,“ etc”
OpenInbox函数返回一个定义该收件箱(文件夹)的对象。 这包括名称。 名称应与第一个参数匹配。 因此,OpenInbox('inbox')返回一个名称属性为“ inbox”的对象,因为该库搜索具有该名称的文件夹并返回与之关联的对象。
问题是,如果未对其进行硬编码,则不会发生这种情况。 它完全是随机的。 返回的对象可以是草稿或任何其他文件夹。 有时它恰好是正确的文件夹。
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> ----------------------------------------- checking: Inbox | 0
> ----------------------------------------- opening...Inbox
这清楚地显示了其0和传递的“收件箱”。 结果将是随机的。 但是,如果我更换
OpenInbox(boxes[count])
同
OpenInbox(boxes[0]) //or just 'inbox'
有用。 当然这是不切实际的...
所以我很困惑。 控制台可以清楚地显示正在传递的内容,但是除非我对控制台中输出的值进行硬编码,否则它不会起作用。 这不可能。 我想念什么吗?
更新:
因此,我偶然添加了以下代码:
console.dir(box)
console.log(box.name)
console.log(JSON.stringify(box))
结果是...
注意带下划线的部分完全不同。
这使我认为它是chrome console.log中的错误或其他原因,因为stringify显示了我期望的数据。
为了使promise与递归一起正常工作并使链条保持顺序,您需要返回内部promise,以便将所有内容正确地链接在一起。 注意我添加return
的地方:
function CheckInboxes (boxes, count=0) {
console.log('-----------------------------------------')
console.log('checking: ' + boxes[count] + ' | ' + count)
console.log('-----------------------------------------')
// return this promise
return OpenInbox(boxes[count]).then(box => {
console.log('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^')
console.dir(box)
console.log('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^')
if(count < boxes.length -1) {
// return this promise
return CheckInboxes(boxes, count + 1);
} else {
console.log('FINISHED<<<<<<<<<<<<<<<<<<<<<<<<<<');
// Is there a proper value to return here?
}
});
}
按照这种方式,您正在创建新的独立的Promise链,它们将相互交错而不是串行运行。
PS:Chrome中的console.log(obj)
存在一些已知问题。 如果您在执行console.log(obj)
之后立即更改obj
,那么Chrome可能不会输出您想要的内容。 似乎并没有立即复制obj
也没有立即执行console.log()
(可能由于进程边界),因此,如果您立即修改obj
,它可能会在console.log()
实际执行其工作之前被更改。 看到这种情况时,通常的解决方法就是您所做的(使用JSON.stringify())。 幸运的是,这种情况并没有那么频繁发生,但是一旦发生,就会非常令人困惑。 我在代码中非常小心,以注意是否要立即修改使用console.log()
输出的对象,如果是, JSON.stringify()
输出所需的属性,或者使用JSON.stringify()
。
boxes
可能是一个对象而不是数组。 用Object.keys(boxes)
检查您的boxes
如果是字符串或数字..
{
"0": {..},
"1": {..},
}
// OR
{
0: {..},
1: {..},
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.