¿Cómo obtengo la URL de descarga una vez que la carga se realiza en el almacenamiento de Firebase

Quiero obtener la URL de descarga una vez que finalice la carga de la imagen y luego downloadURL esté configurado en mi newAds.picLink (object.property), pero en este código ya que la carga está en progreso

newAds.update({ picLink: downloadURL });

se llama, lo que arroja un error ya que downloadURL no está disponible actualmente y está en progreso. He resuelto esto usando setTimeOut a 8 segundos, lo que permite que la imagen se cargue completamente primero y luego se reciba downloadURL, pero eso no es correcto.

¿Cómo puedo crear una devolución de llamada correcta que establezca newAds.picLink = downloadURL una vez que la imagen esté completamente cargada?

 addSubmitted.addEventListener('click', e => {
 const newAds = _db.ref(userID).push();
 const newAd = {
 };

const ref = firebase.storage().ref();
const file = $('#exampleInputFile').get(0).files[0];
const name = (+new Date() + '-' + file.name);
const task = ref.child(name).put(file, {contentType: file.type});

function abc() {
    task.snapshot.ref.getDownloadURL().then((downloadURL) => {
        console.log('File available at', downloadURL);
        console.log(downloadURL);
        newAds.update({ picLink: downloadURL });
    });

    task.catch(error => {
        // Use to signal error if something goes wrong.
        console.log(`Failed to upload file and get link - ${error}`);
    });
}

setTimeout(abc,8000);

Respuestas a la pregunta(2)

Su respuesta a la pregunta