#promise #nestjs #typeorm
Вопрос:
Я пытаюсь вернуть измененные извлеченные данные.Но когда я возвращаю измененный массив, он пуст. Но когда я возвращаю определенный индекс массива, возвращается значение. Я использую nestjs с типом, ниже я прикреплю свой код:
let patientData = await this.patientRepository.find({where:{
hospitalId:option.hospitalId
}})
if(patientData.length){
let return_data:any = []
await Promise.all(patientData.map(async patient => {
return this.patientProcedureValueRepository
.createQueryBuilder("patient_procedure_value")
.leftJoinAndSelect("patient_procedure_value.patientProcedure","patient_procedures")
.where("patient_procedure_value.patient_id = :patientId",{patientId:patient.patientId})
.andWhere("patient_procedure_value.hospital_id = :hospitalId",{hospitalId:patient.hospitalId})
.andWhere("patient_procedures.procedure_name IN(:...ids)",{ids:["Patient Name: First","Patient Name: Middle","Patient Name: Last","Patient Date of Birth"]})
.getRawMany()
}))
.then((data) => {
let return_array:any = []
let tmp_data1 = data.forEach((value,index) => {
let first = value.filter((procedure) => (procedure.patient_procedures_procedure_name === "Patient Name: First"))
let middle = value.filter((procedure) => (procedure.patient_procedures_procedure_name === "Patient Name: Middle"))
let last = value.filter((procedure) => (procedure.patient_procedures_procedure_name === "Patient Name: Last"))
let dob = value.filter((procedure) => (procedure.patient_procedures_procedure_name === "Patient Date of Birth"))
return_array.patientId = (first.length?first[0].patient_procedure_value_patient_id:"")
return_array.firstName = (first.length?first[0].patient_procedure_value_patient_procedure_value:"")
return_array.middleName = (middle.length?middle[0].patient_procedure_value_patient_procedure_value:"")
return_array.lastName = (last.length?last[0].patient_procedure_value_patient_procedure_value:"")
return_array.birthdate = (dob.length?dob[0].patient_procedure_value_patient_procedure_value:"")
if(return_array.patientId !== ""){
return_data.push(return_array)
}
})
})
return return_data
//Below return perticular patient Id correctly
//return return_data[0].patientId
Я не так уж много привык обещать.Заранее спасибо.
Ответ №1:
В data.forEach((value,index)
функции вы меняете return_array
значения на каждой итерации, поэтому только последняя будет задавать значения.
Кроме того, вы используете .then
async
функцию, поэтому код сложнее читать
Это должно сработать:
if (patientData.length) {
const data = await Promise.all(patientData.map(patient => {
return this.patientProcedureValueRepository
.createQueryBuilder("patient_procedure_value")
.leftJoinAndSelect("patient_procedure_value.patientProcedure", "patient_procedures")
.where("patient_procedure_value.patient_id = :patientId", { patientId: patient.patientId })
.andWhere("patient_procedure_value.hospital_id = :hospitalId", { hospitalId: patient.hospitalId })
.andWhere("patient_procedures.procedure_name IN(:...ids)", { ids: ["Patient Name: First", "Patient Name: Middle", "Patient Name: Last", "Patient Date of Birth"] })
.getRawMany()
}))
const return_array = data.map((value) => {
const first = value.filter((procedure) => (procedure.patient_procedures_procedure_name === "Patient Name: First"))
const middle = value.filter((procedure) => (procedure.patient_procedures_procedure_name === "Patient Name: Middle"))
const last = value.filter((procedure) => (procedure.patient_procedures_procedure_name === "Patient Name: Last"))
const dob = value.filter((procedure) => (procedure.patient_procedures_procedure_name === "Patient Date of Birth"))
const obj = {
patientId: (first.length ? first[0].patient_procedure_value_patient_id : ""),
firstName: (first.length ? first[0].patient_procedure_value_patient_procedure_value : ""),
middleName: (middle.length ? middle[0].patient_procedure_value_patient_procedure_value : ""),
lastName: (last.length ? last[0].patient_procedure_value_patient_procedure_value : ""),
birthdate: (dob.length ? dob[0].patient_procedure_value_patient_procedure_value : ""),
}
if (obj.patientId !== "") {
return obj
}
return null
})
.filter(obj => obj !== null) // remove nulls
}