javascript - promise 与递归

标签 javascript node.js recursion

情况是这样的。我继承了一个难以使用的数据库模式(我们以前都遇到过),而 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.recordIdsUsedself.objectCollection 都是模块变量,用于跟踪数据,以便比较时不会不同步循环中的目的。

如果您需要更多代码,请告诉我,因为我不确定需要什么才能理解正在发生的事情。

预先感谢您的帮助!

最佳答案

I need to have all of the awaits in the loop to finish processing prior to the original call to the gatherDataToSync 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/

相关文章:

javascript - 在自定义格式化程序中过滤 JSON 数据

javascript - 如何处理 React Router 递归路径?

javascript - Qml 导入本地文件作为限定符不起作用

node.js - 哟 Angular 误差?

node.js - 部署后Nodejs将不会在Heroku上启动

javascript - 如何设置自定义对象属性以在 Angular typeahead 中进行过滤?

javascript - ES6 生成器如何辅助非阻塞代码?

java - 迭代/递归通过容器和组件来查找给定类的对象?

ruby-on-rails - 数组在递归函数中的奇怪行为

java - 删除二叉树中的所有叶子