【发布时间】:2019-08-18 05:26:44
【问题描述】:
我需要递归遍历 JSON 并在某些情况下调用远程 API。我需要返回最后修改的整个 JSON,但我不知道如何等到 所有承诺都实现
const getObjectsOfRelated = (xmlAsJson, token) => {
if (testIfIwantCallApi()) {
const jsonToReturn = JSON.parse(JSON.stringify(xmlAsJson))
jsonToReturn.elements = callApi(xmlAsJson.text).then(result => {
return result.data
})
return jsonToReturn
}
if (xmlAsJson.elements) {
const jsonToReturn = JSON.parse(JSON.stringify(xmlAsJson))
jsonToReturn.elements = xmlAsJson.elements.map(res => getObjectsOfRelated(res, token))
return jsonToReturn
}
return xmlAsJson
}
即使我尝试使用 setTimeout 破解它,结果也不包括使用外部 API 创建的部分。
这样代码返回正确的结构,带有承诺而不是值我希望它要么返回已完成的承诺,要么能够等到承诺完成。
【问题讨论】:
-
jsonToReturn.elements = xmlAsJson.elements.map(res => getObjectsOfRelated(res, token))... 在此代码中,jsonToReturn.elements将是一个承诺数组...无论您返回jsonToReturn,您都将返回一个未履行承诺的对象( s) -
如果您阅读它,请不要介意已删除的评论...阅读您的代码错误 - 结果
xmlAsJson绝不是 JSON,它只是一个对象 - 而jsonToReturn也不是 JSON - 我'd 建议使用不会混淆的变量名 ... -
您能否提供输入
xmlAsJson的示例以及您希望返回的内容?顺便说一句,即使你做的一切都正确,你永远不会改变xmlAsJson,因此该函数将返回输入xmlAsJson不变 -
JSON.parse(JSON.stringify(xmlAsJson))。为什么要字符串化然后解析?
标签: javascript json recursion promise