У меня есть ассоциативный контейнер (ключ / значение, "хэш"). Я перебираю его, используя цикл for..in:
for (key in container) {
doSomethingWith(key, container[key]
}
Теперь я хочу, чтобы doSomethingWith () возвращала обещание (Q или стандартное), и я хочу выполнять итерации последовательно, а не параллельно. То есть я хочу, чтобы каждый вызов doSomethingWith () разрешал свое обещание перед повторным вызовом.
Как мне это сделать?
Есть ли способ перебирать ключи, не прибегая к Object.keys () (который в моем случае довольно длинный) и индексам? Помог ли новый класс Map?
Это может быть уже кем-то написано. Кроме того, если я хочу иметь ограниченный параллелизм (например, что-то в процессе выполнения чего-то 10) в духе make -j 10), сложность возрастает, поэтому где-то должна существовать зрелая реализация.
Как именно я это делаю? Я предпочитаю использовать вспомогательную функцию, которая вызывает себя из метода 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()
}
}