【发布时间】:2019-02-26 06:58:11
【问题描述】:
我正在尝试找出处理嵌套作业树的最快方法,这些作业在 javascript 中返回承诺。我有以下条件:
- 该进程应返回一个仅在所有嵌套作业都完成时才解析的承诺。
- 同一级别的每个作业都需要按顺序处理,但子级可以并行处理。
- 我不能使用等待/异步。
我已经模拟了一个示例,它汇总了一堆数字并调用公共 Web 服务来模拟实际工作(不幸的是,我无法对此进行编码,因为公共 Web 服务无法通过 https 使用):
function sumNumbers(numbersToSum) {
return numbersToSum.reduce((p, current) => {
return p.then(runningTotal => {
return fetch(`http://numbersapi.com/${current.number}/`)
.then(result => {
var parentTotal = runningTotal + current.number;
if (current.children && current.children.length > 0) {
return sumNumbers(current.children)
.then(childrenTotal => {
return childrenTotal + parentTotal;
});
}
else {
return parentTotal;
}
});
});
}, Promise.resolve(0));
}
var numbers = [
{
number: 2,
children: [
{ number: 1 },
{
number: 3,
children: [
{ number: 2 },
{
number: 1,
children: [
{ number: 1 },
{ number: 2 }
]
}
]
},
{ number: 2 }
]
},
{ number: 4 },
{ number: 5 },
{
number: 3,
children: [
{
number: 1,
children: [
{ number: 1 }
]
},
{ number: 2 }
]
}
];
(() => {
var startTime = new Date();
sumNumbers(numbers)
.then(total => {
var finishTime = new Date();
console.log(`${total} (took ${((finishTime - startTime) / 1000)}s)`);
});
})();
当我在我的网络控制台中运行它时,我得到以下结果:
30 (took 2.839s)
这种方法有效,但是当作业有子作业要处理时,父作业会等待子作业完成,然后再解决并继续处理下一个同级作业。我想知道并行处理子作业是否会更快?
是这样吗?如果是这样,您将如何重写示例以利用该方法?如果没有,一般来说有没有更快的方法?
【问题讨论】:
-
并行?在单线程语言中?这意味着什么?
-
"同层的每个job都需要按顺序处理,但是children可以并行处理。" - 没明白。孩子们在同一水平,对吧?
-
@RichBrowne 是的,但是您希望同时处理树的哪些部分?你说连续的节点需要顺序处理,但是子节点不也是连续的吗?你的意思是不同父节点的子节点?假设我会简单地一次处理所有内容,您到底想在哪里引入依赖项?
-
是的,我正在努力解决不并发的问题。是不是只有根节点必须串联,但之后任何级别的所有子节点都可以并发。 ?例如。
numbers 2,1,2,4,5可以,但2,1,2,5,4不行 -
但是按照这个定义,这不就意味着一切都必须按顺序处理吗?例如。做第一个top 1层,直到第一个的孩子都做完才能做下一个,然后第一层的孩子也需要按顺序排列。
标签: javascript promise