Предполагая, что httpClient()
- это request-promise
, на который вы ссылаетесь, а значение assertion
- это то, что вы пытаетесь передать с этим результатом, вы можете изменить это:
ps.push(httpClient(options));
на это :
ps.push(httpClient(options).then(result => {
return {id: assertion, result};
}));
Тогда ваше обещание будет разрешено для этого объекта, который содержит и результат, и идентификатор, и вы сможете получить доступ к каждому из них в конечном массиве результатов.
Ваш код не показывает, каков текущий результат. Если это уже объект, вы также можете просто добавить свойство id к этому объекту, если хотите. Это зависит от вас, как именно вы сложите этот окончательный результат.
ps.push(httpClient(options).then(result => {
// add id into final result
result.id = assertion;
return result;
}));
В любом случае, общая идея заключается в том, что перед помещением обещания в массив, вы используете обработчик .then()
для небольшого изменения возвращаемого значения. результат, добавляя любые данные, которые вы хотите добавить, и затем возвращая этот новый измененный результат, чтобы он стал разрешенным значением цепочки обещаний.
Чтобы убедиться, что вы обрабатываете все ответы, даже если некоторые имеют ошибка, вы можете использовать более новую [Promise.allSettled()][1]
вместо Promise.all()
, а затем посмотреть, какие ответы удалось или не удалось обработать результаты. Или вы можете отследить любые ошибки, превратить их в разрешенные обещания, но дать им чувственное значение (часто null
), которое вы можете увидеть при обработке окончательных результатов:
ps.push(httpClient(options).then(result => {
// add id into final result
result.id = assertion;
return result;
}).catch(err => {
console.log(err);
// got an error, but don't want Promise.all() to stop
// so turn the rejected promise into a resolved promise
// that resolves to an object with an error in it
// Processing code can look for an `.err` property.
return {err: err};
}));
Затем, позже в вашем код обработки:
Promise.all(ps)
.then((results) => {
console.log(results); // Result of all resolve as an array
// filter out error responses
let successResults = results.filter(item => !item.err);
res.send(successResults );
}).catch(err => console.log(err)); // First rejected promise