繁体   English   中英

Node.JS递归函数错误变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM