Я думаю, вам нужно будет перебрать все обещания и сделать .then()
для каждого обещания и написать частичный ответ, а затем закрыть ответ после выполнения всех обещаний. Нечто подобное должно работать. Порядок ответов может отличаться от порядка массива обещаний. Например, мой пример ниже вернет второе обещание первым.
let res = {
write: (data) => {console.log(data)},
end: () => {}
};
let promise1 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 500);
});
let promise2 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 300);
});
let promises = [promise1, promise2];
let count = 0;
promises.forEach((promise) => {
promise.then((data) => {
res.write(data);
count++;
if (count >= promises.length){
res.end();
}
})
})
Изменено для записи в формате JSON.
let res = {
write: (data) => {
console.log(data)
},
end: () => {}
};
let promise1 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({foo:"bar"});
}, 500);
});
let promise2 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({bar:"foo"});
}, 300);
});
let promises = [promise1, promise2];
let count = 0;
res.write("[");
promises.forEach((promise) => {
promise.then((data) => {
res.write(JSON.stringify(data));
count++;
if (count >= promises.length) {
res.write("]");
res.end();
} else {
res.write(",");
}
})
})
Потоковая передача JSON, как это обычно не происходит, но может использоваться для уменьшения объема памяти, используемой сервером. Это потому, что вам не нужно создавать полный ответ в памяти перед отправкой ответа. Клиенту по-прежнему потребуется достаточно памяти для считывания всего объекта в память.