Это на самом деле сложно, особенно если вы планируете возвращать URL-адрес изображения для случаев использования, когда вам нужно объединить строки с URL-адресом изображения условия onerror
, например, вы можете программно установить параметр url
в CSS.
Хитрость заключается в том, что загрузка изображения по своей природе асинхронная, поэтому onerror
не происходит синхронно, т. Е. Если вы вызываете returnPhotoURL
, он немедленно возвращает undefined
bcs асинхронный метод загрузки / обработки изображениязагрузка только началась.
Итак, вам действительно нужно обернуть ваш скрипт в Promise, а затем вызвать его, как показано ниже.ПРИМЕЧАНИЕ: мой пример сценария выполняет некоторые другие вещи, но показывает общую концепцию:
returnPhotoURL().then(function(value){
doc.getElementById("account-section-image").style.backgroundImage = "url('" + value + "')";
});
function returnPhotoURL(){
return new Promise(function(resolve, reject){
var img = new Image();
//if the user does not have a photoURL let's try and get one from gravatar
if (!firebase.auth().currentUser.photoURL) {
//first we have to see if user han an email
if(firebase.auth().currentUser.email){
//set sign-in-button background image to gravatar url
img.addEventListener('load', function() {
resolve (getGravatar(firebase.auth().currentUser.email, 48));
}, false);
img.addEventListener('error', function() {
resolve ('//rack.pub/media/fallbackImage.png');
}, false);
img.src = getGravatar(firebase.auth().currentUser.email, 48);
} else {
resolve ('//rack.pub/media/fallbackImage.png');
}
} else {
img.addEventListener('load', function() {
resolve (firebase.auth().currentUser.photoURL);
}, false);
img.addEventListener('error', function() {
resolve ('https://rack.pub/media/fallbackImage.png');
}, false);
img.src = firebase.auth().currentUser.photoURL;
}
});
}