Подумайте об этом так:
Всякий раз, когда вы создаете объект в ECMAscript, этот объект формируется в универсальном месте ECMAscript mystique [], где no человек сможет когда-либо получить. Все, что вы вернетесь, - это ссылка на этот объект в этом мистическом месте.
var obj = { };
Даже obj
является только ссылкой на объект (который находится в этом специальном замечательное место), и, следовательно, вы можете передать эту ссылку . Фактически любой фрагмент кода, который обращается к obj , изменит объект , который далеко, далеко.
Самый простой способ написать это - использовать цикл for
внутри функции async
. Обещайте getFile
, чтобы он возвращал Promise
, а затем ожидайте его на каждой итерации цикла. В конце цикла вызовите обратный вызов:
const getFileProm = file => new Promise((resolve, reject) => {
getFile(file, (err, fileName) => {
if (err) reject(err);
else resolve(fileName);
});
});
async function fetchContentOfFiles(fileNames, testCB) {
const fileContent = [];
try {
for (let i = 0; i < fileNames.length; i++) {
fileContent.push(
await getFileProm(fileNames[i])
);
}
} catch(e) {
// handle errors, if you want, maybe call testCB with an error and return?
}
testCB(null, fileContent);
}
Вероятно, было бы даже лучше, если бы fetchContentOfFiles
вызывался и обрабатывался как Обещание , а не с обратными вызовами, а затем ошибки могут быть обработаны потребителем:
async function fetchContentOfFiles(fileNames) {
const fileContent = [];
for (let i = 0; i < fileNames.length; i++) {
fileContent.push(
await getFileProm(fileNames[i])
);
}
return fileContent;
}
fetchContentOfFiles(arr)
.then((fileContent) => {
// do stuff with fileContent
})
.catch((err) => {
// something went wrong
});