【发布时间】:2019-05-08 21:17:26
【问题描述】:
我有一个关联容器(键/值,“哈希”)。我使用 for..in 循环对其进行迭代:
for (key in container) {
doSomethingWith(key, container[key]
}
现在我希望 doSomethingWith() 返回一个承诺(Q 或标准承诺),并且我想按顺序迭代,而不是并行迭代。也就是说,我希望每次调用 doSomethingWith() 在再次调用它之前解决它的承诺。
我该怎么做?
有没有一种方法可以在不使用 Object.keys() (在我的情况下很长)和索引的情况下迭代键?新的 Map 类有用吗?
可能已经有人写过。另外,如果我想要有限的并发性(例如,本着 make -j 10 的精神,正在进行 10 次 somethingWith()),复杂性会爆炸,因此某个地方必须存在一个成熟的实现。
我究竟如何链接它?我的看法是使用一个从 done() 调用自身的辅助函数:
function forEachKey(obj, doSomething) {
const q = Q.defer()
const keys = Object.keys(obj)
const idx = 0
const helper = () =>
if (idx < keys.length) {
doSomething(idx).done(helper)
idx += 1
}
else
{
q.resolve()
}
}
【问题讨论】:
-
只需使用
async/await。这是最简单、最有效的解决方案。 -
要顺序解决一组承诺,你可以这样做
Object.keys(obj).reduce((p, k) => p.then(() => doSomething(k)), Promise.resolve()) -
Array.prototype.reduce()是同步的。我既不能使用它也不能使用 foreach。如果支持从 for..in 内部屈服,它可能是有希望的。我试试看 -
是的,迭代是同步的,但是解析是异步的。我还没有机会和async iterators 一起玩,因为他们还在选秀中。
标签: javascript foreach promise hashmap