Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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 如何在数组中存储foreach返回值并在express中发送两个响应?_Javascript_Reactjs_Mongodb_React Native_Express - Fatal编程技术网

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 } );
    } );