Асинхронность является ключевым аспектом при работе с ml5.js, так как большинство операций библиотеки связаны с загрузкой моделей, обработкой данных и выполнением вычислений, которые требуют времени. Асинхронные функции позволяют не блокировать основной поток выполнения и обеспечивают плавное взаимодействие с интерфейсом и другими частями приложения.
В JavaScript существуют три основных способа работы с асинхронным кодом: callbacks, promises и async/await. Все они применимы к ml5.js, но отличаются стилем написания кода и удобством обработки ошибок.
Callback — это функция, которая передается в другую функцию и вызывается после завершения асинхронной операции. В ml5.js многие методы предоставляют возможность использования callback для обработки результатов.
Пример создания классификатора изображений с использованием callback:
const classifier = ml5.imageClassifier('MobileNet', modelLoaded);
function modelLoaded() {
console.log('Модель загружена');
}
const image = document.getElementById('image');
classifier.classify(image, gotResult);
function gotResult(error, results) {
if (error) {
console.error(error);
return;
}
console.log(results);
}
Особенности callback-подхода:
error.Promise — объект, представляющий результат асинхронной операции, который может быть доступен в будущем. ml5.js начиная с последних версий поддерживает работу с промисами, что делает код более читаемым и структурированным.
Пример работы с промисами:
ml5.imageClassifier('MobileNet')
.then(classifier => {
return classifier.classify(document.getElementById('image'));
})
.then(results => {
console.log(results);
})
.catch(error => {
console.error(error);
});
Преимущества промисов:
.catch().Promise.all и другими
инструментами работы с асинхронными процессами.Async/await — синтаксический сахар поверх промисов, позволяющий писать асинхронный код в стиле синхронного. Это упрощает чтение и сопровождение больших проектов.
Пример с использованием async/await:
async function classifyImage() {
try {
const classifier = await ml5.imageClassifier('MobileNet');
const results = await classifier.classify(document.getElementById('image'));
console.log(results);
} catch (error) {
console.error(error);
}
}
classifyImage();
Преимущества async/await:
try/catch..then().Классификация изображений
(imageClassifier)
classify(), predict().Распознавание позы (poseNet)
estimateSinglePose(),
on('pose', callback).Генеративные модели (GAN,
pix2pix)
Распознавание звука
(soundClassifier)
classify(), события
on('result', callback).error)..catch(error => ...).try/catch.Неправильная обработка асинхронных ошибок может привести к зависанию приложения или отсутствию реакции на результаты модели. Особенно важно для приложений реального времени, например, для видеоаналитики или интерактивного обучения.
В больших проектах часто встречается комбинация методов:
Пример комбинированного подхода:
async function setup() {
const classifier = await ml5.imageClassifier('MobileNet');
const video = document.getElementById('video');
video.addEventListener('loadeddata', () => {
classifier.classify(video, (error, results) => {
if (error) console.error(error);
else console.log(results);
});
});
}
setup();
Такой подход обеспечивает эффективность и читаемость кода, минимизируя вероятность ошибок при асинхронных операциях.
Асинхронность в ml5.js — фундаментальный элемент при работе с современными веб-приложениями, обеспечивающий плавное взаимодействие с пользователем и стабильную работу моделей.