Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
虽然提供了有效数组,但未执行JavaScript for循环_Javascript_Promise_Async Await - Fatal编程技术网

虽然提供了有效数组,但未执行JavaScript for循环

虽然提供了有效数组,但未执行JavaScript for循环,javascript,promise,async-await,Javascript,Promise,Async Await,查找JavaScript for循环未执行的原因时遇到问题。我在下面写了两个我想要执行和运行的简单函数,即:方法应该尝试“模拟”同步代码。 问题是由于某种原因,addNodes()方法中的for循环从未执行过。但是,如果我单独运行,例如逐行运行 var result = []; var addressBookNodes = await generateAddressBooksNodes(); addNodes(result, addressBookNodes); 这告诉我代码运行良好,但很可能

查找JavaScript for循环未执行的原因时遇到问题。我在下面写了两个我想要执行和运行的简单函数,即:方法应该尝试“模拟”同步代码。 问题是由于某种原因,addNodes()方法中的for循环从未执行过。但是,如果我单独运行,例如逐行运行

var result = [];
var addressBookNodes = await generateAddressBooksNodes();
addNodes(result, addressBookNodes);
这告诉我代码运行良好,但很可能与GeneratedDressBooksNodes方法的异步特性有关。如果我只是运行命令:

var addressBookNodes = await generateAddressBooksNodes();
在浏览器中,我得到的对象数组正是我期望得到的。基本上,GeneratedDressBooksNodes返回一个承诺,当该承诺得到解决时,我可以看到返回的正确数组,但我不明白,如果nodes对象至少有一个元素(如下图所示),为什么不执行for循环

function addNodes(result, nodes){
    console.log("3");
    console.log(nodes);
    for (var num in nodes) {
        console.log("4");   
        let singleNode = nodes[num];
        console.log(singleNode);        
        console.log("5");
        result.push(singleNode);
    }
}

async function getAddressBookAndContactNodes() {  
    var result = [];
    console.log("1");
    var addressBookNodesPromise = generateAddressBooksNodes();
    addressBookNodesPromise.then( (arrayOfAddressBookNodes) => {
        console.log("2");
        addNodes(result, arrayOfAddressBookNodes);          
    })      
    return result;  
}

2020年8月26日更新:

在拨动“arrayOfAddressBookNodes”对象后,我注意到一些非常奇怪的东西。我添加了额外的打印语句并打印了“arrayOfAddressBookNodes”数组的长度。在函数中运行时,数组的长度为0。如果对象在for循环之前不久打印,并且如下图所示,长度为:1,则我不理解长度如何为0。这到底是怎么回事

我找到了另一篇文章,也就是说,它基本上解释了这一点。在其中一个例子中,提到了使用Map而不是数组。我决定使用Set,但仍然得到相同的错误,即集合的大小为0,尽管集合包含对象。i、 下面是代码和执行的图片

  async function getAddressBookAndContactNodes() {
    var result = new Set();
    console.log("1");
    var addressBookNodes = await generateAddressBooksNodes();
    console.log("2");
    console.log(addressBookNodes);
    console.log("3");
    console.log("addressBookNodes size : " + addressBookNodes.size);
    addressBookNodes.forEach(function(value) {
        result.add(value);
    });
    console.log("6");
    console.log(result);
    console.log("7");
    return result;
}

所有这些都让一个C++背景的人感到困惑,它让我的脑袋爆炸了。 更新2:2020年8月26日。 好的,我解决了我的问题。问题是,这些承诺与“解释一切”的循环不起作用


我需要使用常规的“for(index=0;index如果
generateAddressBooksNodes
正在返回一个承诺,您可以使用async等待结果:

async function getAddressBookAndContactNodes() {

    var result = [];
    console.log("1");
    var addressBookNodesPromise = await generateAddressBooksNodes();
    // note await here. Also, unless you're using this at a later time in your code, you can save space by not assigning it to a variable and simply returning generateAddressBooksNodes
    
    addNodes(result, arrayOfAddressBookNodes);
    return result;
}

在承诺
然后()
填充array@charlietfl你能给我一个提示,什么是解决这个问题的常见方法吗?即我已经知道我不能从承诺中返回,因此,我不知道该怎么办老实说,我真的不明白为什么你需要将所有这些放入一个不同的数组,而不仅仅是返回
addressBookNodesPromise
并使用它解析的数组我有多个数组,即一个用于通讯簿,一个用于联系人,邮件列表和我需要将这些数组中的所有对象合并到一个数组中,在这种情况下,它被称为“结果”。我刚刚尝试显示一个简化版本的代码,但它不起作用。。。顺便说一句,在不需要循环的情况下添加它们的一种更简单的方法是
结果。推送(…节点)
也不应该使用
,因为在阵列上的
。我不明白为什么这样可以解决问题,尽管我必须说wait看起来更干净,我肯定会使用它。部件4和5不运行。你确定这就是问题所在吗?刚试过这个,这并不能解决for循环没有运行的原始问题