如何解决尽管提供了有效的数组,但未执行JavaScript for循环
难以找到JavaScript for循环未执行的原因。在下面写了两个我想执行并运行的简单函数:购买的方法应尝试“模拟”同步代码。 问题是由于某种原因,永远不会执行addNodes()方法中的for循环。但是,如果我单独运行此代码,例如一行一行
var result = [];
var addressBookNodes = await generateAddressBooksNodes();
addNodes(result,addressBookNodes);
告诉我代码运行良好,但是很可能与 generateAddressBooksNodes 方法的异步性质有关。如果我只运行命令:
var addressBookNodes = await generateAddressBooksNodes();
在浏览器中,我得到的对象数组恰好是我期望得到的。基本上,generateAddressBooksNodes返回一个promise,当该promise解析后,我可以看到返回了正确的数组,但是我不明白为什么如果节点对象至少具有一个元素(如下图所示),则不会执行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。到底是怎么回事?
我找到了另一篇文章,即JavaScript Array.length returning 0,基本上可以解释这一点。在其中一项推荐中,提到使用Map而不是Array。我决定使用Set,尽管Set包含一个对象,但仍然会遇到相同的错误,即set的大小为0。即下面是执行的代码和图片。
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日。 好吧,我解决了我的问题。问题在于,promise无法与for循环一起使用here。
我需要使用常规的“ 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。