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