我目前被困在读取数据,来自进口的aprc函数. 下面是我的forEach函数,它根据当前登录的用户从users集合中获取doc,然后它获取cart字段,该字段是数组,接下来是forEach,它将doc.data()对象推入数组,最后它返回该数组:

export async function readUserCartData(userId){
  const userSnap = await getDoc(doc(db,"users",userId));
  let cartItemsData=[];
  if (userSnap.exists()){
    let productIdArray = userSnap.data().cart;
    productIdArray.forEach(product => {
      let q = query(productsColRef,where('__name__','==',product));
      onSnapshot(q,(snapshot)=>{
        snapshot.docs.forEach(doc =>{
          cartItemsData.push(doc.data());
        });
      });
      
    });

    return cartItemsData;
  }else{
    return Promise.reject(Error(`No such document: ${coll}.${id}`));
  }
    
}

我在这里处理这个函数:

onAuthStateChanged(auth,(user)=>{
  if(user){
    userId = user.uid;
    console.log(userId);
   // readUserData(userId);
    readDocumentById("users",userId).then(data=>{
      userData = data;
      DisplayDeliveryAddress(userData.address.street,userData.address.city,userData.address.postCode);

    });

  readUserCartData(userId).then(data=>{
    console.log(`typeof(data):${typeof(data)}`);
    console.log(data);
    
    
  });
  }
});

logs

我对它无能为力.我试了data = Array(data);console.log(data[0].price);,但它显示"未定义".我想readUserCartData有问题,但我找不到任何解决方案.

推荐答案

下面的代码应该可以做到这一点(未经测试).不要使用将侦听器设置为查询的onSnaphot方法,而是使用由几个getDocs方法调用返回的promise 来使用Promise.all().

export async function readUserCartData(userId) {
  const userSnap = await getDoc(doc(db, "users", userId));
  let cartItemsData = [];
  if (userSnap.exists()) {
    let productIdArray = userSnap.data().cart;

    const promises = [];

    productIdArray.forEach((product) => {
      let q = query(productsColRef, where("__name__", "==", product));
      promises.push(getDocs(q));
    });

    const arrayOfQuerySnapshots = await Promise.all(promises);

    arrayOfQuerySnapshots.forEach((querySnapshot) => {
      querySnapshot.docs.forEach((doc) => {
        cartItemsData.push(doc.data());
      });
    });

    return cartItemsData;
  } else {
    return Promise.reject(Error(`No such document: ${coll}.${id}`));
  }
}

Javascript相关问答推荐

Cookie中未保存会话数据

如何用拉威尔惯性Vue依赖下拉?

为什么useState触发具有相同值的呈现

变量的值在Reaction组件中的Try-Catch语句之外丢失

Eval vs函数()返回语义

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

基于props 类型的不同props ,根据来自接口的值扩展类型

TypeError:无法读取未定义的属性(正在读取';宽度';)

如何使用基于promise (非事件emits 器)的方法来传输数据?

用于测试其方法和构造函数的导出/导入类

用Reaction-RT-Chart创建实时条形图

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

如何在TransformControls模式下只保留箭头进行翻译?

连续添加promise 时,如何在所有promise 都已结算时解除加载覆盖

使用Perl Selify::Remote::Driver执行Java脚本时出错

Played link-Initialize.js永远显示加载符号

如何创建一个for循环,用于计算仪器刻度长度并将其放入一个HTML表中?

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

已在EventListener中更新/更改异步的React.js状态对象,但不会导致组件重新呈现

我正在为我的单选按钮在HTML中设置一个值.使用Java脚本,我如何才能获得该值?