Как передать каждый элемент массива внутрь асинхронных функций и записать результат в файл?
Элементы массива не заходят в асинхронные функции для получения embeddings. в Консоли выдает только "START START START START" и т.д. Не могу понять почему, ведь мэппинг оформлен в Promise, которую мы потом возвращаем и записываем все результаты в файл. Идея такова что надо строчки, которые записаны через запятую для каждого юзера передать в функции TensorFlow и Universal Sentence Encoder, чтобы получить потом вектора для этого текста для каждого юзера и сохранить уже нового юзера с векторами в файл. Но проблема асинхронности не позволяет это сделать. Пример кода для функций энкодэра Там конечно они работают исключительно с then() вместо async/await, но тогда я тем более не понимаю как каждый эдемент может пройти через функции внутри map.
const fillDocument = async () => {
let model = await use.load()
let dataWithVectors = await Promise.all(data.map(async user => {
let sentences = "";
sentences = user.biography + ","
user.latestMedia.forEach(mediaitems => {
if (mediaitems.caption) {
sentences += mediaitems.caption + ","
}
})
console.log("START")
let embeddings = await model.embed([sentences]);
console.log("EMBEDDINGS: ", embeddings);
let arr = await embeddings.array();
user.unit_vector = arr[0];
}));
return dataWithVectors
}
fillDocument().then(data => {
fs.writeFile("./scraper/vectors.json", JSON.stringify(data), 'utf8', function (err) {
if (err) {
console.log("An error occured while writing JSON Object to File.");
return console.log(err);
}
console.log("JSON file has been saved.");
});
})
Ответы (1 шт):
Спасибо всем! Отвечаю на вопрос сама, если поможет кому-нибудь:
заменить Promise.all и map(() => {} на for (let user of data) {...}, который помог из асинхрона сделать синхрон, теперь каждый элемент из лупа ждет выполнение функций внутри loop.
console.log("START")
// let dataWithVectors = await Promise.all(data.map(async user => {
for (let user of data) {
let sentences = "";
sentences = user.biography + ","
for (mediaitem of user.latestMedia) {
if (mediaitem.caption) {
sentences += mediaitem.caption + ","
}
}
console.log("next element: ", data.indexOf(user))
let embeddings = await model.embed([sentences])
console.log("EMBEDDINGS: ", embeddings);
let arr = await embeddings.array();
user.unit_vector = arr[0];
};
console.log("FINISHED")