Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript未正确地将对象推送到数组_Javascript_Firebase_Promise_Google Cloud Firestore - Fatal编程技术网

Javascript未正确地将对象推送到数组

Javascript未正确地将对象推送到数组,javascript,firebase,promise,google-cloud-firestore,Javascript,Firebase,Promise,Google Cloud Firestore,我目前正在开发一款连衣裙应用程序,我遇到了一个问题,它让我花费了好几天的时间,喝了好几杯咖啡,还刮了我的头 基本上,我试图返回一个包含所有服装所有者个人资料数据的数组 事情是这样的: getDressData()=>{ -商店服装细节 -服装店老板 }, getOwnerData()=>{ -环游所有的服装拥有者 -获取他们的个人资料数据 }, 解析()=>{ -返回衣服和过滤器数据 -返回衣服所有者配置文件数据 } 代码如下: 返回新承诺((解决、拒绝)=>{ var db=firebas

我目前正在开发一款连衣裙应用程序,我遇到了一个问题,它让我花费了好几天的时间,喝了好几杯咖啡,还刮了我的头

基本上,我试图返回一个包含所有服装所有者个人资料数据的数组

事情是这样的:

getDressData()=>{
-商店服装细节
-服装店老板
},

getOwnerData()=>{
-环游所有的服装拥有者
-获取他们的个人资料数据
},

解析()=>{
-返回衣服和过滤器数据
-返回衣服所有者配置文件数据
}


代码如下:

返回新承诺((解决、拒绝)=>{
var db=firebase.firestore();
var=[];
var过滤器=[];
var=[];
var ownerData=[];
var dressCollection=db.collection('dresses');
var ownerCollection=db.collection(“账户”);
var-dressref=dressCollection.orderBy(“日期”、“描述”);
dressref.get()
.then(函数(doc){
如果(!单据为空){
doc.docs.forEach(函数(doc){
如果(文件存在){
var item=doc.data();
推({
“dressId”:doc.id,
“颜色”:item.color,
“信用”:item.credit,
“日期”:item.date,
“说明”:item.description,
“图像”:item.images,
“所有者”:item.owner,
“大小”:item.size
});
if(filters.filter(x=>x.size==item.size).length==0){
push({“size”:item.size,“colors”:[item.color]});
} 
否则{
var index=filters.findIndex((x=>x.size==item.size));
如果(!filters[index].colors.filter(x=>x.colors==item.color).length>0){
过滤器[索引].colors.push(项目.颜色);
}
}
if(dressowner.indexOf(item.owner)=-1){
dressOwners.push(item.owner);
}
}
});
}
})
.然后(函数(){
for(设i=0;i<0.length;i++){
ownerCollection.doc(dressOwners[i]).get()
.然后(功能(文档){
如果(文件存在){
item=doc.data();
ownerData.push({
“uid”:doc.id,
“displayName”:item.displayName,
“feedback_neg”:item.feedback_neg,
“反馈位置”:item.feedback位置,
“registerDate”:item.registerDate,
“地址”:item.address,
“电子邮件”:item.email
});
}
});
}
})
.然后(函数(){
决心({
“连衣裙”:连衣裙,
“ownerData”:ownerData,
“过滤器”:过滤器
});
});

});如果我没有弄错,如果您没有从.then返回任何内容,那么在一个链中,.thens会立即解析,因为它们实际上没有通过显式返回等待任何内容。尝试从第一个返回dressOwners。然后在下面使用传入的数据。然后


然后,在下面的。然后,在一个for循环中创建多个承诺的地方,将这些承诺收集到一个数组中,并返回Promis.all(myPromiseArray)的结果以获得最终结果。然后按正确的顺序。

两者都显示了一些长度,而第一个也显示了长度:2问题是我无法从第一个数组获取数据。dress数组(第二个)我可以得到dress[I].颜色等。您可以通过反转
if
条件来减少代码中的嵌套。从
if(!doc.empty){blah}
if(doc.empty){return;}blah您在某些地方嵌套了8或9层。这有助于提高可读性。《代码完成》一书在第19.4节中讨论了太多的嵌套,其中指出超过3级的嵌套会让人感到困惑。如果你没有从a.返回任何东西,那么在一个链中,所有的.then或多或少都会同时运行,因为它们实际上没有等待任何东西。你能在文档中引用吗?听起来不对。承诺链将不会执行该系列中的下一个承诺,直到前一组承诺得到解决。对,但是如果我有一个.then,并且它没有返回任何内容,那么下面的.then如何开始?我相信它基本上是立即返回的,它不会等待任何内部代码完成,因为如果没有显式返回,它无法知道内部代码是否完成。我完全承认我在这里可能是错的,但这是我一直以来的做法。它知道在以前的承诺得到解决时开始。承诺不需要解析为值。他们无法解决任何问题。世界上没有任何地方说承诺链将同时运行。无论如何,考虑到JS是单线程的,这在JS中是不可能的。如果,在a.then中,我执行了一个异步操作,并且我不返回任何内容,那么我们不知道等待任何内容,承诺会解决,链接到下一个。然后不等待异步操作解决。因此,可能不是并发的,而是以同步顺序进行,而不必像开发人员预期的那样等待异步操作的结果