Загрузка данных и получение URL-адреса загрузки являются асинхронными операциями. Пока идет вызов к серверу, остальная часть вашего кода продолжает выполняться. Затем, когда сервер вернул данные, ваш обратный вызов будет вызван.
Это проще всего понять, если вы поместите несколько операторов регистрации:
console.log("Starting upload...");
imgRef1.put(file1).then(function(snapshot) {
console.log('Uploaded a blob or file. Getting download URL...');
snapshot.ref.getDownloadURL().then(function(downloadURL) {
console.log("File available at", downloadURL);
imgAns1 = downloadURL;
});
console.log("Started getting download URL");
}).catch(error => {
console.error("Error occurred: "+error);
});
console.log("Started upload");
Если вы запустите этот код, вывод будет :
Начало загрузки ...
Начало загрузки
Загружен большой двоичный объект или файл. Получение загружаемого URL-адреса ...
Начало получения загрузочного URL-адреса
Файл доступен по адресу ...
Таким образом, код не выполняется в том же порядке, в котором он существует в вашем файле. Вместо этого обратные вызовы вызываются позже, после завершения вызовов к серверу. Из-за этого любой код, которому нужны данные с сервера, должен находиться внутри функции обратного вызова или вызываться оттуда.
Скорее всего, вы звоните document.getElementById("imgSelectAns1").src = imgAns1
откуда-то из Ваш код, когда imgAns1 = downloadURL
еще не был вызван.
Исправление - переместить этот код в обратный вызов:
imgRef1.put(file1).then(function(snapshot) {
snapshot.ref.getDownloadURL().then(function(downloadURL) {
document.getElementById("imgSelectAns1").src = downloadURL;
});
}).catch(error => {
console.error("Error occurred: "+error);
});