Javascript 从数组返回已完成的数组。在firebase foreach中推送

Javascript 从数组返回已完成的数组。在firebase foreach中推送,javascript,node.js,firebase,promise,google-cloud-functions,Javascript,Node.js,Firebase,Promise,Google Cloud Functions,目前我对nodejs(v6.14.0)不太满意,因为我发出了一个post请求,在返回有效响应之前必须做一些工作。问题是,我得到一个空数组作为响应(如果我多次重新运行请求,响应将是有效的),我已经研究并需要管理te承诺是如何解决和返回的,但我看不到我需要做什么,因为我看到这比我发现的示例更复杂,我需要更深入的建议或指导。这是我的代码: ru.post('/route', (request, response) => { let rBody = request.body; let weekDa

目前我对nodejs(v6.14.0)不太满意,因为我发出了一个post请求,在返回有效响应之前必须做一些工作。问题是,我得到一个空数组作为响应(如果我多次重新运行请求,响应将是有效的),我已经研究并需要管理te承诺是如何解决和返回的,但我看不到我需要做什么,因为我看到这比我发现的示例更复杂,我需要更深入的建议或指导。这是我的代码:

ru.post('/route', (request, response) => {
let rBody = request.body;
let weekDay = getDay(rBody.date);  // Return day => "Monday"
let cRef = adminDb.database().ref('/fields/');
return cRef.orderByChild('field_size').equalTo(rBody.type).once('value').then((snap) => {
    let arrResult = new Array;
    snap.forEach(fields => {
        infoField = fields.val();
        let idFi = infoField.id_fi;
        let idCen = infoField.id_cen;
        let id_rsvp = idFi + "_" + rBody.date + "_" + idCen;
        let id_rsvp2 = idFi + "_" + rBody.date + "_" + idCen + "_" + rBody.hour;
        let resRef = adminDb.database().ref('/rsvp/' + id_rsvp + '/' + id_rsvp2);
        resRef.on('value', snap => {
            if (snap.val() === null) {
                if (infoField.act === "true") {
                    let cenRef = adminDb.database().ref('/cen/' + idCen);
                    cenRef.on('value', snap => {
                        let infoCen = snap.val();
                        if (infoCen.act === "true") {
                            values = infoField.ft;
                            daySelected = weekDay;
                            dayCheck = values[daySelected];
                            hourSelected = rBody.hour;
                            hourCheck = dayCheck[hourSelected];
                            if (hourCheck !== "" && hourCheck !== "0") {
                                infoField.lat = infoCen.lat;
                                infoField.lon = infoCen.long;
                                if (rBody.lat !== undefined && rBody.long !== undefined) {
                                    infoField.dGet = true;
                                } else {
                                    infoField.dGet = false;
                                }
                                infoField.address = infoCen.address;
                                uRef = adminDb.database().ref('/users/');
                                uRef.child(rBody.userid).child('/fav/').orderByChild('id_fi').equalTo(idFi).on('value', snap => {
                                    if (snap.exists() === true) {
                                        infoField.fav = true
                                    } else {
                                        infoField.fav = false
                                    }
                                    arrResult.push(infoField); //how to get this arrResult (completed) to use on the next .then() on first try?
                                })
                            }
                        }
                    })
                }
            }
        })
    })
    return arrResult;
}).then((res) => {
    console.log("check",res);
    return response.status(200).json(res); // Fist response is [], if it a new request with the same values it works...
}).catch(err => {
    return response.status(err.status >= 100 && err.status < 600 ? err.code : 500).send(err.message);
})});

我只知道在第二次运行后,第一次运行时它保持为空[]

我对您的代码进行了一些编辑,您没有正确处理承诺:

ru.post('/route', (request, response) => {
  let rBody = request.body;
  let weekDay = getDay(rBody.date); // Return day => "Monday"
  let cRef = adminDb.database().ref('/fields/');
  return cRef.orderByChild('field_size').equalTo(rBody.type).once('value').then((snapshot) => {
    let arrResult = [];
    snapshot.forEach(fields => {
      let infoField = fields.val();
      let idFi = infoField.id_fi;
      let idCen = infoField.id_cen;
      let id_rsvp = idFi + "_" + rBody.date + "_" + idCen;
      let id_rsvp2 = idFi + "_" + rBody.date + "_" + idCen + "_" + rBody.hour;
      let resRef = adminDb.database().ref('/rsvp/' + id_rsvp + '/' + id_rsvp2);
      return resRef.on('value', snap => {
        if (snap.val() === null) {
          if (infoField.act === "true") {
            let cenRef = adminDb.database().ref('/cen/' + idCen);
            return cenRef.on('value', snap => {
              let infoCen = snap.val();
              if (infoCen.act === "true") {
                let values = infoField.ft;
                let daySelected = weekDay;
                let dayCheck = values[daySelected];
                let hourSelected = rBody.hour;
                let hourCheck = dayCheck[hourSelected];
                if (hourCheck !== "" && hourCheck !== "0") {
                  arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/lat').set(infoCen.lat));
                  arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/lon').set(infoCen.long));
                  if (rBody.lat !== undefined && rBody.long !== undefined) {
                    arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/dGet').set(true));
                  } else {
                    arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/distanciaGet').set(false));
                  }
                  arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/address').set(infoCen.address));
                  const uRef = adminDb.database().ref('/users/');
                  uRef.child(rBody.userid).child('/fav/').orderByChild('id_fi').equalTo(idFi).on('value', snap => {
                    if (snap.exists() === true) {
                      arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/fav').set(true));
                    } else {
                      arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/fav').set(false));
                    }
                  });
                }
              }
            });
          }
        }
      });
    });
    return Promise.all(arrResult);
  }).then((res) => {
    console.log("check", res);
    return response.status(200).json(res); // Fist response is [], if it a new request with the same values it works...
  }).catch(err => {
    return response.status(err.status >= 100 && err.status < 600 ? err.code : 500).send(err.message);
  });
});
ru.post('/route',(请求、响应)=>{
让rBody=request.body;
让weekDay=getDay(rBody.date);//返回日期=>“星期一”
让cRef=adminDb.database().ref('/fields/');
返回cRef.orderByChild('field_size').equalTo(rBody.type)。一次('value')。然后((快照)=>{
设arresult=[];
snapshot.forEach(字段=>{
设infoField=fields.val();
设idFi=infoField.id\u-fi;
设idCen=infoField.id\u cen;
设id_rsvp=idFi+“”+rBody.date+“”+idCen;
设id_rsvp2=idFi+“”+rBody.date+“”+idCen+“”+rBody.hour;
设resRef=adminDb.database().ref('/rsvp/'+id\u rsvp+'/'+id\u rsvp2);
返回resRef.on('value',snap=>{
if(snap.val()==null){
如果(infoField.act==“true”){
让cenRef=adminDb.database().ref('/cen/'+idCen);
返回cenRef.on('value',snap=>{
让infoCen=snap.val();
如果(infoCen.act==“true”){
让值=infoField.ft;
让daySelected=工作日;
let dayCheck=值[daySelected];
让hourSelected=rBody.hour;
让hourCheck=dayCheck[hourSelected];
if(hourCheck!==“和&hourCheck!==“0”){
arresult.push(adminDb.database().ref('/fields/'+fields.key+'/lat').set(infoCen.lat));
arresult.push(adminDb.database().ref('/fields/'+fields.key+'/lon').set(infoCen.long));
if(rBody.lat!==未定义和&rBody.long!==未定义){
arresult.push(adminDb.database().ref('/fields/'+fields.key+'/dGet').set(true));
}否则{
arresult.push(adminDb.database().ref('/fields/'+fields.key+'/distance').set(false));
}
arresult.push(adminDb.database().ref('/fields/'+fields.key+'/address').set(infoCen.address));
const uRef=adminDb.database().ref('/users/');
uRef.child(rBody.userid).child('/fav/').orderByChild('id_-fi')).equalTo(idFi).on('value',snap=>{
if(snap.exists()==true){
arresult.push(adminDb.database().ref('/fields/'+fields.key+'/fav').set(true));
}否则{
arresult.push(adminDb.database().ref('/fields/'+fields.key+'/fav').set(false));
}
});
}
}
});
}
}
});
});
返回承诺。全部(结果);
})。然后((res)=>{
控制台日志(“检查”,res);
return response.status(200).json(res);//第一个响应是[],如果它是一个新的请求,并且具有与它工作时相同的值。。。
}).catch(错误=>{
返回response.status(err.status>=100&&err.status<600?err.code:500)。发送(err.message);
});
});

感谢您的快速回答是的,这与我如何处理承诺有关,但我不知道如何解决。好的,我尝试了你的答案,但是它返回一个[{true,true,false}]数组,并且它在第一次尝试时返回空,然后在第二次/第三次尝试时它被填充(我想要解决的相同行为)。我已经更新了我的问题,关于返回的数组在第一次尝试时应该是什么样子。请现在测试并让我知道你好!只是尝试了一下,结果与第一次尝试时返回空的行为相同,然后在第二次/第三次尝试时得到填充,它没有等待完成te工作,在上面的foreach上使用一些日志进行了测试,这些日志在响应部分还不知道为什么之前被执行,并且还尝试修改以进一步测试,但到目前为止,我无法让它工作。另外,当我在第14行设置return时,return resRef.on('value',snap=>foreach将只对一个无法计算的项目进行一次计算。
ru.post('/route', (request, response) => {
  let rBody = request.body;
  let weekDay = getDay(rBody.date); // Return day => "Monday"
  let cRef = adminDb.database().ref('/fields/');
  return cRef.orderByChild('field_size').equalTo(rBody.type).once('value').then((snapshot) => {
    let arrResult = [];
    snapshot.forEach(fields => {
      let infoField = fields.val();
      let idFi = infoField.id_fi;
      let idCen = infoField.id_cen;
      let id_rsvp = idFi + "_" + rBody.date + "_" + idCen;
      let id_rsvp2 = idFi + "_" + rBody.date + "_" + idCen + "_" + rBody.hour;
      let resRef = adminDb.database().ref('/rsvp/' + id_rsvp + '/' + id_rsvp2);
      return resRef.on('value', snap => {
        if (snap.val() === null) {
          if (infoField.act === "true") {
            let cenRef = adminDb.database().ref('/cen/' + idCen);
            return cenRef.on('value', snap => {
              let infoCen = snap.val();
              if (infoCen.act === "true") {
                let values = infoField.ft;
                let daySelected = weekDay;
                let dayCheck = values[daySelected];
                let hourSelected = rBody.hour;
                let hourCheck = dayCheck[hourSelected];
                if (hourCheck !== "" && hourCheck !== "0") {
                  arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/lat').set(infoCen.lat));
                  arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/lon').set(infoCen.long));
                  if (rBody.lat !== undefined && rBody.long !== undefined) {
                    arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/dGet').set(true));
                  } else {
                    arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/distanciaGet').set(false));
                  }
                  arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/address').set(infoCen.address));
                  const uRef = adminDb.database().ref('/users/');
                  uRef.child(rBody.userid).child('/fav/').orderByChild('id_fi').equalTo(idFi).on('value', snap => {
                    if (snap.exists() === true) {
                      arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/fav').set(true));
                    } else {
                      arrResult.push(adminDb.database().ref('/fields/' + fields.key + '/fav').set(false));
                    }
                  });
                }
              }
            });
          }
        }
      });
    });
    return Promise.all(arrResult);
  }).then((res) => {
    console.log("check", res);
    return response.status(200).json(res); // Fist response is [], if it a new request with the same values it works...
  }).catch(err => {
    return response.status(err.status >= 100 && err.status < 600 ? err.code : 500).send(err.message);
  });
});