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 !