情况如下。我继承了一个难以使用的数据库模式(我们以前都曾在那里工作过),而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
都是模块变量,用于跟踪数据,以便在循环中不进行同步以进行比较。
如果您需要更多代码,请告诉我,因为我不确定需要了解所发生的一切。
提前感谢您的帮助!
答案 0 :(得分:2)
我需要让循环中的所有
await
在完成对gatherDataToSync
函数的原始调用之前完成处理,以将其promise返回给它所调用的函数。
那不是async function
的工作方式。来电的承诺是总是立即返回(这是一件好事)。然而,在函数完成处理的所有代码之前,承诺不是已解决,包括来自await
的暂停。
您的代码可能已按预期正常工作。
答案 1 :(得分:1)
我不确定以下代码是否适合您(取决于您如何根据突变值改变值和SecondViewController
的实现方式)。问题是你必须返回一些内容,以便referenceHelper.includes
的来电者知道它何时完成。
您的代码不会返回任何内容,但如果它返回gatherDataToSync
,它将以最慢的方式执行,因为它会堆叠所有异步处理。
await self.gatherDataToSync