Я пытаюсь создать функцию, которая передает события из функции загрузки Firebase, а затем показывает прогресс в моем пользовательском интерфейсе.
У меня есть функция, которая обрабатывает загрузку изображения следующим образом:
import firebase from '~/firebase';
import hashSum from 'hash-sum';
import events from 'events'
async function uploadFile(image, design) {
const eventEmitter = new events.EventEmitter();
const hashId = hashSum(image.name + Date.now())
const meta = {
customMetadata: {
namne: image.name
}
}
const storageRef = firebase.storage().ref().child(`designs/${firebase.auth().currentUser.uid}/${design.id}/${hashId}.png`);
const task = storageRef.put(image, meta);
task.on('state_changed',
(snapshot) => {
const percentage = snapshot.bytesTransferred / snapshot.totalBytes * 100;
eventEmitter.emit('progress', percentage)
console.info(percentage)
},
(err) => {
eventEmitter.emit('error', err)
},
() => {
task.snapshot.ref.getDownloadURL().then(url => {
eventEmitter.emit('done', {url, hashId})
})
}
)
}
export { uploadFile }
А затем в своем пользовательском интерфейсе я хочу получать эти события и что-то с ними делать:
const upload = await uploadFile(selectedFile, {id: this.props.match.params.id})
upload.on('done', async (data) => {
files.push({id: data.hashId ,name: selectedFile.name, url: data.url})
await firebase.firestore().collection('designs').doc(firebase.auth().currentUser.uid).collection('designs').doc(this.props.match.params.id).update({
files
})
})
upload.on('error', (err) => {
message.error(err)
})
upload.on('progress', (percent) => {
this.setState({
uploadProgress: percent
})
})
Теперь ясно, что я делаю что-то не так, поскольку upload.on не является функцией. Может ли кто-нибудь посоветовать, как с этим справиться, или есть более простой способ вернуть уже существующее событие?
Я отредактировал свой пост, но может я что-то не так делаю? Ссылка на функцию, похоже, все еще не работает



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


похоже, вы получаете обратно
Promiseи используетеasync, разве вам не стоит использовать функциюawait?