JS обещание или асин c ожидают возврата как обещание объекта - PullRequest
0 голосов
/ 29 января 2020

Я знаю, что об этом спрашивали миллионы раз. Я сам спросил. В частности, с кодом ниже, я не знаю, почему это не разрешается.

const householdPics = (data, props) => {
  let refImg;

  async function refDetails() {
    let urlResult;
    const ref = await props.firebase.storageRef(`images/${data.profilePic}`);
    return urlResult = new Promise((resolve, reject) => {
      ref.getDownloadURL()
      .then(url => resolve(url))
      .catch(e => reject(e))
    })
  }

  if (!data.profilePic || data.profilePic == 'NULL') {
    refImg = require("../../assets/img/empty-avatar.png");
  } else {
    refImg = refDetails();
  }

Я уверен, что я слишком усложняю это, я занимался этим так долго, что я все запутался. Я ожидал бы refImg = refDetails();, чтобы разрешить URL. если я console.log urlResult, я получаю URL-адрес img из firebase. Однако, когда я использую refImg в другом блоке кода:

sr c появляется как Object Promise

Я также пытался:

  async function refDetails() {
    const ref = await props.firebase.storageRef(`images/${data.profilePic}`);
    const refUrl = await ref.getDownloadURL();
    return refUrl;
  }

Вот еще одна попытка I ' Я попробовал после прочтения больше об этом. По-прежнему происходит сбой: (* ​​1013 *

  let refImg;

  function refDetails() {
    const ref = props.firebase.storageRef(`images/${data.profilePic}`);
    const imgUrl = ref.getDownloadURL()
    return imgUrl.then(url => {return url})
  }

  if (!data.profilePic || data.profilePic == 'NULL') {
    refImg = require("../../assets/img/empty-avatar.png");
  } else {
    const resultImg = refDetails();;
    refImg = resultImg;
  }

Как передать возвращаемое значение ref.getDownloadURL () в refImg?

1 Ответ

0 голосов
/ 29 января 2020

Попробуйте:

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, если вы его возвращаете (хотя я не рекомендую его, поскольку это немного сбивает с толку).

...