gpt4 book ai didi

javascript - 为什么我的 Promises 递归 Javascript 函数失败

转载 作者:行者123 更新时间:2023-11-30 10:03:00 25 4
gpt4 key购买 nike

我有一个 JSON 对象,我需要清理以 $ 开头的属性。所以下面给出的结构应该去掉 $aaa$bbb$ccc$eee:

{
$aaa: "$aaa",
bbb: "bbb",
$ccc: {
$ccc2: "$ccc2",
ccc2a: "ccc2a"
},
ddd: {
$ddd: "$ddd2",
ddd2a: "ddd2a"
},
$eee: "$eee",
fff: "fff"
}

我还想让它异步运行并使用 Promises。但是我在让它工作时遇到了麻烦。它无法清理 $eee 并且我不确定我哪里出错了。以下是完整代码和 plunker is here :

function clean$(obj1) {
var obj = obj1;
return new Promise(function(res, rej) {
setTimeout(function() {
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
if (i.match(/^\$/)) {
console.log("delete this " + i);
delete obj[i];
} else if (typeof obj[i] === "object") return clean$(obj[i]);
}
}
res();
}, 1000);
})
}

sample = {
$aaa: "$aaa",
bbb: "bbb",
$ccc: {
$ccc2: "$ccc2",
ccc2a: "ccc2a"
},
ddd: {
$ddd: "$ddd2",
ddd2a: "ddd2a"
},
$eee: "$eee",
fff: "fff"
}

clean$(sample).then(function(res) {
console.log("why it never gets here???");
})

最佳答案

问题是这一行:

} else if (typeof obj[i] === "object") return clean$(obj[i]);

一旦它遇到一个要递归进入的对象,就返回该递归调用的结果。但是,因为它在那个点返回,所以它没有完成对当前级别的元素的迭代。

在您的示例中,代码递归清理 ddd 并返回其结果,因此不会继续清理 $eee

有多种方法可以解决这个问题。一种方法是建立一个返回 promise 的列表,这些 promise 是对 clean 的递归调用,并且只有在它们全部解决后才返回。

关于javascript - 为什么我的 Promises 递归 Javascript 函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30631939/

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