JS承诺或异步等待作为对象承诺返回

我知道这已经被询问了无数次。我自己问过具体到下面的代码,我不知道为什么无法解决。

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();可以解析为网址。 如果我console.log urlResult,我会从firebase获得img网址。 但是,当我在另一个代码块中使用refImg时:

src显示为“对象承诺”

我也尝试过:

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

这是我在阅读了更多内容之后尝试的另一种尝试。仍然失败:(

  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?

lihaitomsah1 回答:JS承诺或异步等待作为对象承诺返回

尝试:

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()是一个Promise,为了使用结果值(即url),您必须在.then的回调中获取它,或者使用async await语法,使异步过程似乎像我先前的回答一样进行同步。

imgUrl.then(url => {return url}) Promise.then()也是Promise,因此您在第二次尝试中仍会在函数中返回promise。因此,refImg = resultImg使得refImg成为“返回URL的承诺”。

您认为上一个答案不起作用的原因可能是您打电话给householdPics()并尝试在不使用.thenawait的情况下获取值。由于我将householdPics设为异步函数,因此它将始终返回Promise。同样,您必须使用.thenawait获取值。

更新2

我刚刚尝试过返回异步功能中的承诺。看来,如果您在类似以下的异步函数中返回Promise而不是已解析的值:

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

然后等待该功能:

refImg = await refDetails();

它仍然解析并返回Promise的值。因此,如果要返回await,请在异步函数中保存该df.columns = ['c1','c1T1','c2','c2T1',...........,'c10','c10T1','c30','c30T2','c40','c40T2','c60','c60T2'] (尽管它很容易混淆,但我不建议这样做)。

本文链接:https://www.f2er.com/2694628.html

大家都在问