Попробуйте:
const householdPics = async (data, props) => {
let refImg;
async function refDetails() {
let urlResult;
const ref = await props.firebase.storageRef(`images/${data.profilePic}`);
return await ref.getDownloadURL():
}
if (!data.profilePic || data.profilePic == 'NULL') {
refImg = require("../../assets/img/empty-avatar.png");
} else {
refImg = await refDetails();
}
ОБНОВЛЕНИЕ:
ref.getDownloadURL()
- это Обещание, и для использования значения результата, которое является URL, вы ДОЛЖНЫ получить его внутри обратного вызова .then
, или вы используете синтаксис async await
, из-за чего асинхронный c процесс выглядит синхронизированным, как в моем предыдущем ответе.
imgUrl.then(url => {return url})
Promise.then () также Promise, так что вы ' Вы по-прежнему возвращаете обещание в функции во второй попытке. Поэтому refImg = resultImg
приводит к тому, что refImg
делает "Обещание, возвращающее URL-адрес".
Причина, по которой вы думаете, что предыдущий ответ не работает, возможно, заключается в том, что вы вызвали householdPics()
и пытаетесь получить значение без использования .then
или await
. Поскольку я сделал householdPics
asyn c функцией, она всегда возвращает Promise. Итак, еще раз, вы должны получить значение с помощью .then
или await
.
UPDATE 2
Я только что попытался вернуть Promise в asyn c function . Кажется, что если вы возвращаете Promise вместо разрешенного значения в асинхронной c функции, такой как:
async function refDetails() {
let urlResult;
const ref = await props.firebase.storageRef(`images/${data.profilePic}`);
return ref.getDownloadURL():
}
, тогда ждите функцию:
refImg = await refDetails();
, она все равно разрешает и возвращает Стоимость Обещания. Таким образом, вы можете сохранить этот await
в функции asyn c, если вы его возвращаете (хотя я не рекомендую его, поскольку это немного сбивает с толку).