@leha_trushin

Как сделать аналог promise.all из массива промисов с обработкой resolve для каждого промиса?

Упрощенное описание. Есть массив объектов (пусть objs), у которых есть поля a и b. Есть функция func, которая принимает значение поля a и возвращает промисс с некоторым результатом x, вычисленном на основе а. Есть массив промиссов arr. Формируется так.
var arr = [];
for(var i=0; i<objs.length; i++)
{
    arr.push(func(objs[i][a]));
}

Далее идет параллельный вызов всех промисов из массива arr
Promise.all(arr);
Задача: навесить then не на выполнение всех промиссов arr, а на каждый по отдельности. В каждом then обработать выполнение конкретного промиса и самое главное каким-то образом восстановить по значению x, к какому объекту из objs[cur] он принадлежит и использовать значение objs[cur][a]. По второй части части подозреваю, что весь объект надо прокидывать, но загвоздка в том, что нельзя менять функцию func, которая работает относительно поля a объекта

UPD. Как отслеживать выполнение каждого промиса кажется уже сам надумал. Написать внешнюю функцию f(a), принимающую значение objs[...][a] и возвращающую промис. А массив тогда заполнять примерно так:
var arr = [];
for(var i=0; i<objs.length; i++)
{
    arr.push(f(objs[i][a])).then(
         function(result)
         {
              //обрабатываем результат ...
         }
    ));
}

Пока на уровне соображений, запрогать смогу чуть позже. Если тут все верно, остается вторая часть вопроса.
  • Вопрос задан
  • 3338 просмотров
Решения вопроса 1
lazalu68
@lazalu68
Salmon
Просто в цикле пишите не var i = 0, а let i = 0, тогда в колбэке then сможете использовать этот индекс. Тогда можно и от обертки отказаться.

Как-то так
function func(k) {
    return new Promise((resolve, reject) => {
        setTimeout(function() {
            resolve( k**2 );
        }, 1000);
    });
};

var objs = [
        { a: 6, b: 2 },
        { a: 5, b: 3 },
        { a: 2, b: 4 }
    ],
    arr = new Array(objs.length);

for(let i = 0; i < arr.length; i++) {
    arr[i] = func(objs[i].a);
    arr[i].then(function(result) {
        console.log(`Target index is ${i}, initial value (a) is ${objs[i].a}, result is ${result}`);
    });
}
А можно и не сохранять промисы.
function func(k) {
    return new Promise((resolve, reject) => {
        setTimeout(function() {
            resolve( k**2 );
        }, 1000);
    });
};

var objs = [
        { a: 6, b: 2 },
        { a: 5, b: 3 },
        { a: 2, b: 4 }
    ];

objs.forEach((item, index) => func(item.a).then(result => console.log(`Target index is ${index}, initial value (a) is ${objs[index].a}, result is ${result}`)));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы