Обещать.все возвращают пустой массив

#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
}