Javascript 如何在数组中存储foreach返回值并在express中发送两个响应?
我试图在数组中存储医生详细信息,并显示预约和医生姓名值响应。 预约值已实现,但医生姓名值为空,即使它显示在控制台中Javascript 如何在数组中存储foreach返回值并在express中发送两个响应?,javascript,reactjs,mongodb,react-native,express,Javascript,Reactjs,Mongodb,React Native,Express,我试图在数组中存储医生详细信息,并显示预约和医生姓名值响应。 预约值已实现,但医生姓名值为空,即使它显示在控制台中 我猜这与时间有关。在医生得到解决之前,您可以访问res.json。尝试使用Promise.all()以确保在继续此操作之前具有这些值 Promise.all([appointment, doctorNameValue]) .then(()=>{ res.json({ appointments: appointment,
我猜这与时间有关。在医生得到解决之前,您可以访问res.json。尝试使用Promise.all()以确保在继续此操作之前具有这些值
Promise.all([appointment, doctorNameValue])
.then(()=>{
res.json({
appointments: appointment,
doctorNameValue
});
});
当然,这意味着您必须稍微更改代码,以适应doctorNameValue,您应该在
forEach
循环完成后发送,请尝试以下操作:
var count = 0;
appointment.forEach(async element => {
const doctor = element.doctor_id;
const doctorDetails = await Doctor.findById({
_id: doctor
});
count++;
doctorNameValue.push(doctorDetails);
console.log(doctorNameValue);
if(count == appointment.length){
res.json({
appointments: appointment,
doctorNameValue
});
}
});
在执行foreach之前,您需要等待请求完成。一种方法是
router.get("/user/:userId", async (req, res) => {
res.then(resp =>
// Store your response in array
);
})
首先,您可以通过预约获得多个
医生id
。查找:
const doctorIds = (await Appointment.find({
user_id: uservalue
})).map(item => `${item.doctor_id}`));
doctorIds
的结果是:
[
"5dcfb0bf705db7342f1314e7",
"5dcfb19c705db7342f1314e8",
"5dcfb2d36faa53418c61127a"
]
然后,您可以在mongoose中使用数组\u id
进行查找,如下所示:
const doctorDetails = await Doctor.find({
_id: { $in: doctorIds }
});
console.log(doctorDetails)
// Here you can get arrayDoctorDetails Object
// Send doctorDetails to client
res.json({
data: doctorDetails
});
请记住:对于Mongoose,您可以对上述数组字符串使用$in
,但是对于Mongodb,您不能这样做。使用mongodb,您必须转换为ObjectID(“..”),如下所示:
$in: [ObjectId("5dcfb0bf705db7342f1314e7"), ObjectId("5dcfb19c705db7342f1314e8")]
async和await不适用于需要回调的循环。需要回调的循环示例包括forEach、map、filter和reduce JavaScript之所以这样做是因为forEach不支持承诺。它不能支持异步和等待。在forEach中不能使用wait 尝试对while或for-loop使用async和wait。JavaScript将暂停执行,直到等待的承诺得到解决。这意味着for循环中的等待应该以串联方式执行
按建议使用for循环或while并在其工作时进行更新。因为您的
约会.forEach()中的函数是异步的,forEach不会等待每个函数完成后再继续下一个。因此,当您到达res.json()
时,所有承诺都没有得到解决
您正在寻找:
const { userId } = req.params;
if( !userId ) return res.status( 400 ).json( { message: 'No userId provided.' } );
const user = await User.findById( userId );
if( !user ) return res.status( 404 ).json( { message: `User "${ userId }" not found.` } );
const appointments = await Appointment.find( { user_id: userId } );
/*
Use new Set() to remove duplicates. I don't use
Mongo so IDK if it does this automatically.
*/
const doctorIds = [ ...new Set( appointments.map( ( { doctor_id } ) => doctor_id ) ) ];
const doctors = await Doctor.find( { _id: { $in: doctorIds } } );
return res.json( { appointments, doctors, user } );
然而,这将是一个很好的时间来了解,和
这不是最有效的方法,但它更接近您最初的方法
/*
Use Array.prototype.map() to return an array
of promises from `Doctor.findById()`. Note that
we are not awaiting.
*/
const promises = appointments.map(
( { doctor_id } ) =>
Doctor.findById( doctor_id )
);
/*
Promise.all() will only resolve once all promises
in `promises` have resolved.
*/
const doctors = await Promise.all( promises );
return res.status( 200 ).json( { appointments, doctors, user } );
我想解释Promise.all()
最简单的方法是:
/*
Just some async functions that resolve
To strings.
*/
const calcFunc = async ( ) => {
return 'Calc';
};
const searchFunc = ( ) => {
return new Promise( resolve => resolve( 'Search' ) );
};
const promiseArray = [ calcFunc( ), searchFunc( ) ];
const [ calcResults, searchResults ] = await Promise.all( promiseArray );
console.log( { calcResults, searchResults } );
//Or
Promise.all( promiseArray )
.then( ( [ calcResults, searchResults ] ) => {
console.log( { calcResults, searchResults } );
} );
/*
Just some async functions that resolve
To strings.
*/
const calcFunc = async ( ) => {
return 'Calc';
};
const searchFunc = ( ) => {
return new Promise( resolve => resolve( 'Search' ) );
};
const promiseArray = [ calcFunc( ), searchFunc( ) ];
const [ calcResults, searchResults ] = await Promise.all( promiseArray );
console.log( { calcResults, searchResults } );
//Or
Promise.all( promiseArray )
.then( ( [ calcResults, searchResults ] ) => {
console.log( { calcResults, searchResults } );
} );