我正在使用以下代码将一个或多个文件上传到Firebase存储。上传完成后,将在控制台中记录downloadURL。
当所有文件都上传后,我想在forEach函数之外执行另一个函数。完成所有上传任务后,如何打印控制台日志?
onSubmit = e => { e.preventDefault(); const { files } = this.state; files.forEach(file => { const uploadTask = Storage.ref(`files/${file.name}`).put(file); uploadTask.on('state_changed', snapshot => { const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100; console.log(progress); }, error => { console.log(error) }, () => { uploadTask.snapshot.ref.getDownloadURL().then(downloadURL => { console.log(downloadURL); }); }); }); //Wait till all uploads are completed console.log('all uploads complete'); }
UploadTask对象的行为与promise一样,因为它们具有then()和catch()方法。因此,您可以将它们全部收集到一个数组中,并用于Promise.all()生成另一个承诺,当所有上载完成时,该承诺将解决。
Promise.all()
const promises = []; files.forEach(file => { const uploadTask = Storage.ref(`files/${file.name}`).put(file); promises.push(uploadTask); uploadTask.on('state_changed', snapshot => { const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100; console.log(progress); }, error => { console.log(error) }, () => { uploadTask.snapshot.ref.getDownloadURL().then(downloadURL => { console.log(downloadURL); }); }); }); Promise.all(promises).then(tasks => { console.log('all uploads complete'); });