情况是这样的。我继承了一个难以使用的数据库模式(我们以前都遇到过),而 Node 现在更加强调了这一点。我需要做的是递归地遍历记录的关系(大多数时候是 one2many)并在记录的对象等于数组常量中的一个集合时停止,但仅限于那个关系链。所有其他关系都需要继续下去,直到它们也达到相同的点。我们的每个部署的关系数量可能会有所不同,因此无法创建静态解决方案。
gatherDataToSync: async (connection, recordId) => {
self.recordIdsUsed.push(recordId);
let objectId = await referenceHelper.getObjectIdForRecordId(connection, recordId);
let objectData = await self.getRelatedObjectsInformation(connection, recordId);
self.objectCollection.push({
"recordId": recordId,
"objectId": objectId,
objectData
});
if (referenceHelper.includes(self.objectListToStopExecutionAt, objectId) === false) {
let relationships = objectData['relationships'];
if (relationships != null) {
for (let i = 0; i < relationships.length; i++) {
if (referenceHelper.includes(self.relationshipsToIgnore, relationships[i]['id']) === false) {
let relationshipRecordIds = relationships[i]['relationships'];
if (relationshipRecordIds != null) {
for (let j = 0; j < relationshipRecordIds.length; j++) {
if (referenceHelper.includes(self.recordIdsUsed, relationshipRecordIds[j]) === false) {
await self.gatherDataToSync(connection, relationshipRecordIds[j]);
}
}
}
}
}
}
}
},
那是我的递归方法。我需要让循环中的所有 await
完成处理,然后再对 gatherDataToSync
函数进行原始调用,以将其 promise 返回给调用它的函数.有没有办法做到这一点,还是我没有考虑这个问题?
self.recordIdsUsed
和 self.objectCollection
都是模块变量,用于跟踪数据,以便比较时不会不同步循环中的目的。
如果您需要更多代码,请告诉我,因为我不确定需要什么才能理解正在发生的事情。
预先感谢您的帮助!
最佳答案
I need to have all of the
await
s in the loop to finish processing prior to the original call to thegatherDataToSync
function to return its promise back to the function it was called from.
async function
不是这样工作的。调用的 promise 总是立即返回(这是一件好事)。但是,在函数中的所有代码完成其处理(包括 await
的暂停)之前, promise 不会解决。
您的代码很可能已经按预期工作了。
关于javascript - promise 与递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47898523/