gpt4 book ai didi

JavaScript promise : Recursively Building Promise Chain With Breadth-First Traversal

转载 作者:行者123 更新时间:2023-11-30 16:13:26 24 4
gpt4 key购买 nike

原生 Javascript ES5/ES6 promise

我正在尝试导入具有递归关系的数据,因为数据库(mongodb)正在分配 id - 必须加载父级(异步)在它的 child 可以被加载之前(也是异步的)。

例如,此任务列表中的任务 B。

任务 A - 一些过程

任务 B - 递归异步加载(bread-first 遍历)

任务 C - 依赖于任务 B

注意,因为任务 C 在任务 B 完成之前无法启动,我假设需要构建一个 promise 链,该链在完成之前不会退出。

假设正在构建的链看起来像这样:(这棵树只有1个头)

promiseParent.then(Promise.all(childrenPromises.then(Promise.all(grandChildrenPromsies.then(....)))))

我想它会像广度优先队列一样遍历(我更喜欢如果可能的话,我想尽量避免使用队列数据结构)

我发现这个很难破解。任何建议或解决方案?

最佳答案

Promise 链可以动态扩展,在链中的任何点插入新链接,只需从任何 .then 执行处理程序返回一个 promise。

假设每个任务都用它的子项数组来解决。如果 child 可以并行处理,那么:

promiseParent
.then(children => Promise.all(children.map(child => loadChild(child))))
.then(grandchildren => Promise.all(grandchildren.map(child => loadChild(child))))

应该做的。如果子项必须顺序处理,则:

let sequence = (a, f) => a.reduce((p, c) => p.then(() => f(c)), Promise.resolve());

promiseParent
.then(kids => sequence(kids, kid => loadChild(kid)).then(() => nextGen())
.then(gkds => sequence(gkds, kid => loadChild(kid)).then(() => nextGen())

会这样做(我通过假设 nextGen 知道返回下一代来简化)。

如果必须递归发现 child 的数量,那么:

let loadChildrenRecursively = child => loadChild(child)
.then(nextChild => nextChild && loadChildrenRecursively(nextChild));

promiseParent
.then(firstChild => loadChildrenRecursively(firstChild)).then(() => nextGen())
.then(firstGchild => loadChildrenRecursively(firstGchild)).then(() => nextGen())

应该这样做。

要将此泛化到 N 个级别,请选择上面的任何方法,比如并行,然后对其进行递归:

let doGeneration = generation =>
Promise.all(generation.map(child => loadChild(child))))
.then(offsprings => offsprings && doGeneration(offsprings))

promiseParent.then(children => doGeneration(children));

因此,只要有更多事情要做,您就可以随时扩展 resolving a promise with another promise (这就是您通过从 .then 履行处理程序返回新 promise 而隐式执行的操作)。

关于JavaScript promise : Recursively Building Promise Chain With Breadth-First Traversal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35880926/

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