Как я могу загрузить несколько файлов в хранилище Firebase одновременно? - PullRequest
0 голосов
/ 07 мая 2018

Я создаю приложение в ionic+angularfire2 и хочу загрузить несколько изображений в firebase storage, но я хочу загрузить их все сразу или по крайней мере X в то время (x > 1).

сейчас я загружаю их вот так

async imageUpload(name, file) {
    // The storage path
    const path = name;
    // The main task
    let img = 'data:image/jpg;base64,' + file;
    return this.task = this.afStorage.ref('/').child(name).putString(img, 'data_url').then((snapshot) => {
    console.log(snapshot)
}).catch((err) => {
    console.log(err);
});

}

тогда я просто зациклился на массиве, который содержит файлы

let newDocId = this.afStore.createId();
for (var i = 0; i < this.lotProvider.uploadFoto.b64Image.length; i++) {
    let name = 'feriaganadera/'+newDocId +'/'+ (+ new Date()) + "-image_foto_jpeg_" + i + ".jpeg";
    this.imageUpload(name, this.lotProvider.uploadFoto.b64Image[i]);
}

это работает, файлы загружены, но он должен ждать, пока файл загрузит следующий.

Как я могу назвать функции асинхронными? поэтому imageUpload не нужно ждать изображения.

1 Ответ

0 голосов
/ 08 мая 2018

Попробуйте с Promise.all, сначала измените вашу функцию imageUpload на это, чтобы вернуть обещание:

imageUpload(name, file) {

    return new Promise((resolve, reject) =>{
        // The storage path
        const path = name;
        // The main task
        let img = 'data:image/jpg;base64,' + file;
        this.task = this.afStorage.ref('/').child(name).putString(img, 'data_url').then((snapshot) => {
            console.log(snapshot);
            resolve(snapshot);
        }).catch((err) => {
            console.log(err);
            reject(err);
        });
    });
}

И используйте Promise.all со своим массивом строк base64:

Promise.all(this.lotProvider.uploadFoto.b64Image.map(async (img) => {
    console.log(img);
    const content = await this.imageUpload('name','file');
    return content;
}))
.then(values => { 
    console.log(values);
})
.catch((err) => {
    console.log(err);
});

Это «запустит» ваши загрузки во время создания обещаний, то есть как итерация массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...