Angular 8 мои вложенные циклы читают окончательные возвращенные идентификаторы из API вместо того, чтобы получать идентификаторы из каждой итерации и применять к ним скрипт? - PullRequest
0 голосов
/ 25 февраля 2020

Я звоню нескольким API для вставки данных в базу данных.

В основном данные представляют собой 2 превосходства, связанные друг с другом.

Я проведу oop до первого Excel fromArray, вставляйте каждую строку за раз. После добавления строки я получу идентификатор, возвращенный из ответа API, а затем увеличу go до второго excel toArray, l oop поверх него, чтобы получить связанные строки для строки из первого excel. Каждая строка из второго excel добавляется в базу данных, и я снова получу идентификатор строки, добавленной в db.

Теперь после каждой итерации я получу 2 идентификатора из каждого excel.

let registered_hh_id = '';
let registered_mbr_id = '';
fromArray.forEach((value, idx) => {
      // console.log(fromArray[key]['Name'])
      let fromArrayPromise = new Promise((resolve, reject)=>{

  let attributes = [

    { attribute: "lhMhyp9F1kg", value: value["HH_last_name"] != "" ? value["HH_last_name"] : "" },
    { attribute: "v4nxGLRD3n8", value: value["HH_status"] != "" ? value["HH_status"] : "" }
  let data = {
    Type: this.formGroup.controls.entity_from.value,
    Unit: this.formGroup.controls.organization.value,
    attributes: attributes
  }
  registered_hh_id = '';


  this.api.postData(data).subscribe(
        (response) => {
          // registered_hh_id = '';
          // console.log(response)
          if (response['httpStatus'] == "OK"
            && response['httpStatusCode'] == 200
            && response['message'] == "Import was successful.") {

            registered_hh_id = response['response']['importSummaries'][0]['reference'];
            console.log("check hh_id", registered_hh_id)

В этот момент я могу получить на каждой итерации различный registered_hh_id. Поэтому, если l oop прочитает 3 массива из Excel, на консоли я увижу их нормально.

Теперь, получив 200 в качестве http-кода состояния, я сделаю регистрацию этого идентификатора. в таблицу следующим образом:

this.api.makeEnrollment(registered_hh_id,
              this.formGroup.controls.program_from.value,
              "ACTIVE", this.formGroup.controls.organization.value,
              enrollDate, enrollDate).subscribe(
                (response) => {
                  if (response['httpStatusCode'] == 200) {
                    resolve();

На этом этапе, после регистрации возвращенного идентификатора из первого вызова, сценарий go переходит ко второму Excel, ищет все массивы, в которых встречается условие требования и добавьте строку за строкой в ​​базу данных:

                fromArrayPromise.then(()=>{

                toArray.forEach((mbr_value, id) => {
                  if (mbr_value['hh_new_id'] == value['hh_new_id']) {
                      let mbr_attributes = [

                        { attribute: "TN0ZUAIq3jr", value: mbr_value["hh_new_id"].toString() },
                        { attribute: "YvQdThw2NdW", value: mbr_value["mbr_new_id"].toString() },
                        { attribute: "jQrM04xaPxb", value: mbr_value["first_name"] != "" ? 
                            mbr_value["first_name"] : "" },
                        { attribute: "CybsW0GygpD", value: mbr_value["last_name"] != "" ? 
                            mbr_value["last_name"] : "" },

                      ]
                      let mbr_data = {
                        trackedEntityType: this.formGroup.controls.entity_to.value,
                        orgUnit: this.formGroup.controls.organization.value,
                        attributes: mbr_attributes
                      }

                      this.api.postData(mbr_data).subscribe(
                        (response) => {
                          if (response['httpStatus'] == "OK"
                            && response['httpStatusCode'] == 200
                            && response['message'] == "Import was successful.") {
                            registered_mbr_id = response['response']['importSummaries'][0]['reference'];

                            this.api.makeEnrollment(registered_mbr_id,
                              this.formGroup.controls.program_to.value,
                              "ACTIVE", this.formGroup.controls.organization.value,
                              enrollDate, enrollDate).subscribe(
                                (response) => {
                                  if (response['httpStatusCode'] == 200 && response['httpStatus'] == "OK"
                                  && response['message'] == "Import was successful.") {
                                        //Problem is occuring here. Connection Section.
                                  }
                          }

Теперь внутри ответа, если httpStatusCode равно 200, мы зарегистрируем человека в программу и получим его возвращенный идентификатор registered_mbr_id.

В конце мне нужно соединить связанный registered_hh_id из первого l oop, с registered_mbr_id второго l oop в другой стол.

Что происходит заключается в том, что добавляются только последние два сгенерированных registered_mbr_id и registered_hh_id, а остальные просто не связаны друг с другом посредством последнего вызова API:

Этот сценарий находится внутри сценария подключения (см. выше):

                                console.log(registered_hh_id, registered_mbr_id)

                                let programOwners = [{
                                  ownerOrgUnit: this.formGroup.controls.organization.value,
                                  program: this.formGroup.controls.program_from.value,
                                  trackedEntityInstance: registered_hh_id
                                }];
                                let relationships = [
                                  {
                                    lastUpdated: this.datePipe.transform(myDate, 'yyyy-MM-ddTHH:mm:ss'),
                                    created: this.datePipe.transform(myDate, 'yyyy-MM-ddTHH:mm:ss'),
                                    relationshipName: "LBN_HH_MBR_Relationship",
                                    bidirectional: false,
                                    relationshipType: this.formGroup.controls.relation_id.value,
                                    relationship: "wMECqtsc47R",
                                    from: {
                                      trackedEntityInstance:{
                                        trackedEntityInstance: registered_hh_id,
                                        programOwners: []
                                      }
                                    },
                                    to: {
                                      trackedEntityInstance:{
                                        trackedEntityInstance: registered_mbr_id,
                                        programOwners: []
                                      }
                                    },
                                    // relationshipType: this.formGroup.controls.relation_id.value
                                  }
                                ];
                                let data = {

                                  programOwners: programOwners,
                                  relationships: relationships
                                }
                                this.api.addRelation(registered_hh_id, data).subscribe(
                                  (response) => {
                                    if (response['httpStatusCode'] == 200 && response['message'] == 'Import was successful.') {
                                      console.log("relation added")
                                    }
                                  },
                                  (error) => {
                                    console.log(error)
                                  }
                                );

Позволяет скажем, у меня есть в первом файле Excel 2 строки.

На первой итерации у меня будет идентификатор, возвращенный из первого вызова API. Затем скрипт будет go во второй l oop и добавит в БД все связанные строки, используя условие if для определенных c критериев. Для каждой строки во втором l oop возвращается другой идентификатор.

Мне нужно соединить эти 2 идентификатора через другой API.

Проблема в том, что последний API вызывается один раз, для окончательных идентификаторов, сгенерированных из финальных l oop итераций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...