Javascript: запуск двух последовательных ожиданий дает неверные результаты - PullRequest
0 голосов
/ 06 марта 2020
async function getHistoriqueDesOperatiosnSav(callback) {
  operationSavsHistorique = await models.journal_operation_sav.findAll({
    order: [["id", "ASC"]]
  });
  const resObj = operationSavsHistorique.map(
    async operationSavHistoriqueEntry => {
      const mapStatusToDisplayedValue = {
        produit_recu: "Produit reçu",
        en_livraison: "En livraison",
        en_reparation: "En cours de réparation",
        repare: "Réparé",
        en_expedition: "Envoyé au client",
        expedie: "Reçu par le client",
        annule: "Annulé"
      };

      operationSav = await operationSavHistoriqueEntry.getOperation_sav();
      admin = await operationSavHistoriqueEntry.getAdmin();

      logger.error(
        "retrieved operationSav by using Async is",
        operationSav.nom_operation
      );
      logger.error("retrieved admin by using Async is", admin.nom);

      return Object.assign({
        id: operationSavHistoriqueEntry.id,
        nom_operation: operationSav.nom_operation,
        admin: admin.nom,
        status: mapStatusToDisplayedValue[operationSavHistoriqueEntry.status]
      });
    }
  );
  const operationSavToDisplay = await Promise.all(resObj);
  callback(operationSavToDisplay);
}

Эта функция дает такой результат:

[


       {
        "id": 1,
        "nom_operation": "TestRefresh",
        "admin": "Administrateur Ghrib",
        "status": "Réparé"
    },
    {
        "id": 2,
        "nom_operation": "TestRefresh",
        "admin": "Administrateur Ghrib",
        "status": "En livraison"
    },
    {
        "id": 3,
        "nom_operation": "TestRefresh",
        "admin": "Administrateur Ghrib",
        "status": "En livraison"
    },
    {
        "id": 4,
        "nom_operation": "TestRefresh",
        "admin": "TechnicienTestOperationSav",
        "status": "En cours de réparation"
    },
    {
        "id": 5,
        "nom_operation": "TestRefresh",
        "admin": "TechnicienTestOperationSav",
        "status": "Réparé"
    },
    {
        "id": 6,
        "nom_operation": "TestRefresh",
        "admin": "TechnicienTestOperationSav",
        "status": "En cours de réparation"
    },
    {
        "id": 7,
        "nom_operation": "TestRefresh",
        "admin": "TechnicienTestOperationSav",
        "status": "Réparé"
    },
    {
        "id": 8,
        "nom_operation": "TestRefresh",
        "admin": "Administrateur Ghrib",
        "status": "En livraison"
    },
    {
        "id": 9,
        "nom_operation": "TestRefresh",
        "admin": "Administrateur Ghrib",
        "status": "En livraison"
    },
    {
        "id": 10,
        "nom_operation": "TestRefresh",
        "admin": "TechnicienTestOperationSav",
        "status": "En cours de réparation"
    },
    {
        "id": 11,
        "nom_operation": "TestRefresh",
        "admin": "TechnicienTestOperationSav",
        "status": "En cours de réparation"
    },
    {
        "id": 12,
        "nom_operation": "TestRefresh",
        "admin": "TechnicienTestOperationSav",
        "status": "Réparé"
    },
    {
        "id": 13,
        "nom_operation": "TestRefresh",
        "admin": "Administrateur Ghrib",
        "status": "Envoyé au client"
    }
]

Проблема: Свойство nom_operation всегда одинаково. В базе данных это отличается .
Это, очевидно, проблема с моей реализацией двух await :

 operationSav = await operationSavHistoriqueEntry.getOperation_sav();
          admin = await operationSavHistoriqueEntry.getAdmin();

Я пытался исправить это так:

async function getHistoriqueDesOperatiosnSav(callback) {
  operationSavsHistorique = await models.journal_operation_sav.findAll({
    order: [["id", "ASC"]]
  });
  const resObj = operationSavsHistorique.map(
    async operationSavHistoriqueEntry => {
      const mapStatusToDisplayedValue = {
        produit_recu: "Produit reçu",
        en_livraison: "En livraison",
        en_reparation: "En cours de réparation",
        repare: "Réparé",
        en_expedition: "Envoyé au client",
        expedie: "Reçu par le client",
        annule: "Annulé"
      };

      // Begin first call and store promise without waiting
      const someResult = operationSavHistoriqueEntry.getOperation_sav();

      // Begin second call and store promise without waiting
      const anotherResult = operationSavHistoriqueEntry.getAdmin();

      // Now we await for both results, whose async processes have already been started
      const [admin, operationSav] = [await someResult, await anotherResult];
      // At this point all calls have been resolved
      // Now when accessing someResult| anotherResult,
      // you will have a value instead of a promise
      return Object.assign({
        id: operationSavHistoriqueEntry.id,
        nom_operation: operationSav.nom_operation,
        admin: admin.nom,
        status: mapStatusToDisplayedValue[operationSavHistoriqueEntry.status]
      });
    }
  );
  const operationSavToDisplay = await Promise.all(resObj);
  callback(operationSavToDisplay);
}

И это результат :

[
  {
    id: 1,
    nom_operation: undefined,
    admin: undefined,
    status: 'Réparé'
  },
  {
    id: 2,
    nom_operation: undefined,
    admin: undefined,
    status: 'En livraison'
  },
  {
    id: 3,
    nom_operation: undefined,
    admin: undefined,
    status: 'En livraison'
  },
  {
    id: 4,
    nom_operation: undefined,
    admin: undefined,
    status: 'En cours de réparation'
  },
  {
    id: 5,
    nom_operation: undefined,
    admin: undefined,
    status: 'Réparé'
  },
  {
    id: 6,
    nom_operation: undefined,
    admin: undefined,
    status: 'En cours de réparation'
  },
  {
    id: 7,
    nom_operation: undefined,
    admin: undefined,
    status: 'Réparé'
  },
  {
    id: 8,
    nom_operation: undefined,
    admin: undefined,
    status: 'En livraison'
  },
  {
    id: 9,
    nom_operation: undefined,
    admin: undefined,
    status: 'En livraison'
  },
  {
    id: 10,
    nom_operation: undefined,
    admin: undefined,
    status: 'En cours de réparation'
  },
  {
    id: 11,
    nom_operation: undefined,
    admin: undefined,
    status: 'En cours de réparation'
  },
  {
    id: 12,
    nom_operation: undefined,
    admin: undefined,
    status: 'Réparé'
  },
  {
    id: 13,
    nom_operation: undefined,
    admin: undefined,
    status: 'Envoyé au client'
  }
]

Вопрос 1: Почему в первом сценарии nom_operation свойство всегда одинаково?
Вопрос 2: Почему поля nom_operation и admin оба undefined во втором сценарии?
Вопрос 3: Как мне это исправить?


РЕДАКТИРОВАТЬ 1: Я немного изменил функцию:

И даже при том, что она записывает правильные данные operationSav и admin. Другими словами, он извлекает правильные результаты из базы данных.

2020-03-06T15:22:54+0100 <info> OperationSavServices.js:393  result[1] is: 
{
  id: 76,
  nom: 'TechnicienTestOperationSav',
  email: 'TechnicienTestOperationSav@gmail.com',
  mot_de_passe: 'U2FsdGVkX18zRDQHQaiOCs1Jpk4Lv8JHPpvfTkWWNpY=',
  last_login: null,
  role: 'operateur_sav',
  createdAt: 2020-03-04T13:21:13.595Z,
  updatedAt: 2020-03-04T13:21:13.595Z
}
2020-03-06T15:22:54+0100 <info> OperationSavServices.js:391  result[0] is: 
{
  id: 28,
  nom_operation: 'OperationTestRefresh999',
  num_serie: 'OperationTestRefresh999',
  address_mac: 'OperationTestRefresh999',
  sous_garantie: false,
  description: 'OperationTestRefresh999',
  adminId: 8,
  produitId: 2,
  status: 'repare',
  nomClient: 'OperationTestRefresh999',
  createdAt: 2020-03-04T14:49:27.977Z,
  updatedAt: 2020-03-06T09:56:25.014Z
}
2020-03-06T15:22:54+0100 <info> OperationSavServices.js:393  result[1] is: 
{
  id: 76,
  nom: 'TechnicienTestOperationSav',
  email: 'TechnicienTestOperationSav@gmail.com',
  mot_de_passe: 'U2FsdGVkX18zRDQHQaiOCs1Jpk4Lv8JHPpvfTkWWNpY=',
  last_login: null,
  role: 'operateur_sav',
  createdAt: 2020-03-04T13:21:13.595Z,
  updatedAt: 2020-03-04T13:21:13.595Z
}

Окончательный результат остается таким же, как в сценарии 2 !

...