Я пытаюсь дождаться нескольких обратных вызовов, но не могу придумать, как сделать это красиво.
Мой код:
module.exports.getFilledOnlineFormsOfArray = (formIDs, callback) => {
let forms = [];
for (let i = 0; i < formIDs.length; i++) {
this.getFilledOnlineFormByID(formIDs[i], (err, filledForm) => {
if (err) callback(err);
else forms.push(filledForm);
});
}
callback(null, forms);
};
Как мне позвонить callback(null, forms)
только после разрешения каждого обратного вызова getFilledOnlineFormByID
(IE (err, filledForm)
)?
Я придумал решение написать:
module.exports.getFilledOnlineFormsOfArray = (formIDs, callback) => {
let forms = [];
let count = formIDs.length;
for (let i = 0; i < formIDs.length; i++) {
this.getFilledOnlineFormByID(formIDs[i], (err, filledForm) => {
if (err) callback(err);
else forms.push(filledForm);
count--;
if (count === 0)
callback(null, forms);
});
}
};
Но плохо так кодировать это. Я уверен, что есть более элегантное решение этой проблемы.
Я искал ответы в Интернете, но все, что я нашел, это как преобразовать его в асинхронные функции, и я не могу сделать это в моем проекте прямо сейчас.
РЕДАКТИРОВАТЬ:
Я пытался использовать Promise.all
так:
module.exports.getFilledOnlineFormsOfArray = (formIDs, callback) => {
let forms = [];
let async = [];
for (let i = 0; i < formIDs.length; i++) {
async.push(this.getFilledOnlineFormByID(formIDs[i], (err, filledForm) => {
if (err) callback(err);
else forms.push(filledForm);
}));
}
Promise.all(async).then(callback(null, forms));
};
но это не сработало.