[Promise All] Récupérer résultat
Bonjour,
Concernant les Promesse en JS, je doit setter la ou les valeur(s) dans une MAP(clé,valeur).
Seulement je n'ai pas mon tableau entier :
Code:
1 2 3
| Map {
'Startpage' => Map { 'TranslationsSubSections' => Map {} },
'Aboutpage' => Map {} } |
voici la promesses:
Code:
1 2 3 4 5 6 7
|
let test = Promise.all([getTranslation(key, value)]);
test.then(function (result) {
myArrayArray.set(key,result);
}); |
quand je veux stocker le resultat dans une variable depuis la promesse je recupere un undefined.
et quand ma variable est dans ma promesse et que je veux y acceder depuis l'exterieur :
Code:
1 2 3 4 5 6
| let test = Promise.all([getTranslation(value, lang)]);
test.then(function (result) {
mymap = result;
});
translatedArray.set(key,mymap); |
j'ai ce resultat:
Code:
1 2 3 4 5 6 7 8 9 10
| Map {
'Title' => undefined,
'Intro' => undefined,
'Startpage' => Map {
'TranslationSections' => undefined,
'TranslationsSubSections' => Map {
'TitleOne' => undefined,
'TitleTwo' => undefined,
'TitleTree' => undefined } },
'Aboutpage' => Map { 'TranslationSections' => undefined } } |
mon tableau avant traitement:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| {
"Title": "Translation example",
"Intro": "Hello I am et, I am 500 years old.",
"Startpage": {
"TranslationSections": "Hello World",
"TranslationsSubSections" :{
"TitleOne" : "Hello All",
"TitleTwo" : "Hello You",
"TitleTree" : "Hello Me"
}
},
"Aboutpage": {
"TranslationSections": "We are letsboot"
}
} |
quand j'essaie de stoker les valeurs de ma promesses dans un tableau
Code:
1 2 3 4
| let test = Promise.all([getTranslation(value, key)]);
test.then(function (result) {
mymap[key] = result;
}); |
j'ai cette erreur..:
Code:
(node:1562) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot set property 'TitleOne' of undefined
Je touche au but mais j'ai un manque de compréhension envert le fonctionnement des promesses.
Merci pour votre aide.
Encore un petit effort avant de trouvé..
Je reprend ou j'en suis maintenant:
je mon promisse All comme ce-ci:
Code:
1 2 3 4 5 6 7 8 9 10
|
function sendToGoogleTranslate(array, lang) {
if (array && array.size > 0) {
let myloop = mytest(array,lang);
Promise.all(myloop).then(function(promises){
console.log("Arriver en dernier");
});
}
} |
Normalement je doit avoir mes promisse avant mon log?
ou je me trompe ? Je commence seulement a comprendre
voici mes promisses:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
function doSometing(translatedArray,result,key){
return new Promise((resolve) => {
setTimeout(() =>{
resolve(translatedArray.set(key,result));
},1000)
} ).then((value) => console.log("dosometings -> " + key));
}
function mytest(array, lang)
{
var translatedArray = new Map();
let promise = [];
array.forEach(function(value,key) {
if (value instanceof Object) {
translatedArray.set(key, mytest(value, lang));
console.log("inside an object map");
}
else {
getTranslation(value, lang, (result) => {
promise.push(doSometing(translatedArray,result,key));
});
console.log(" value befor do someting"+value);
}
});
return promise;
} |
voici mon resultat:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Arriver en dernier
Arriver en dernier
Arriver en dernier
dosometings -> TranslationSections
dosometings -> TitleTwo
dosometings -> TranslationSections
dosometings -> Intro
dosometings -> TranslationSections
dosometings -> Title
dosometings -> TranslationSections
dosometings -> TranslationSections
dosometings -> TitleTwo
dosometings -> Title
dosometings -> TitleTree
dosometings -> Intro
dosometings -> TitleTree
dosometings -> TranslationSections
dosometings -> TitleOne
dosometings -> Title
dosometings -> Intro
dosometings -> TitleOne
dosometings -> TitleOne
dosometings -> TitleTwo
dosometings -> TitleTree |
Le resultat des promisses viens au fur et mesure et du coup mon message en console
Code:
console.log("Arriver en dernier");
devrait venir en dernier..
J’ai réalisé des séquences de test..
Comme tu a dit si élégamment,
J'ai du mal à comprendre ce qui est synchrone ou pas.
Je vais travailler sur cela dès que j'ai le temps.
Pour ce qui est du code,
- Le timeout n'a rien à faire la
- Je récupère bien les promesses après mon log
Je te remercie pour tes explications.
Mais pour finir en beauté,
Maintenant je dois reconstruire ma structure en objet
Avec couple clés et valeurs.
Ma question est la suivante :
- J'ai la clé
- J'ai la valeur
- Et fais un push dans mon tableau
Seulement mes couples ne sont pas ensemble.
Je veux dire est-ce c'est possible d'utiliser un Map()?
Ou un objet à la place du tableau de promesses ?
Resultat des promises = un tableau
Bonsoir Watilin,
ma fonction retourne bien mon resultat sous forme d'un tableau de resultats.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
function sendToGoogleTranslate(array, lang) {
if (array && array.size > 0) {
let myloop = mytest(array,lang);
Promise.all(myloop)
// .then(function(promises){
// writeToJsonFile(lang, promises);
// })
.then((promises) => {
promises.forEach((value) => {
console.log("key => "+value);
});
});
}
} |
cette fonction est appelé dans cette boucle afin de passe le(s) fichier(s) Json et le transposer en structure clés valeurs Map.
Code:
1 2 3 4 5 6
|
langsToTranslate.forEach( (value, key) => {
sendToGoogleTranslate(value, key);
}); |
et langToTranslate içi:
Code:
1 2 3 4 5 6 7 8
|
fs.readdirSync(assetsFolder).forEach(file => {
...
let map = new Map(transformToArrayKeyValue(parsedJSON));
langsToTranslate.set(key, map);
}); |
Voici mon cas que je voudrai réaliser:
- Utiliser le tableau de promesse resultat escompté
- et reconstruire une structure clés valeurs (MAP)
- et le transformer en objet pour fournir un fichier Json
voici ma structure du tableau de promesses:
Code:
1 2 3 4 5 6 7 8
|
TRANSLATED WORD (fr) [ 'exemple de traduction',
'bonjour je suis et, j\'ai 500 ans.',
'bonjour le monde',
'bonjour à tous',
'salut toi',
'bonjour moi',
'nous sommes letsboot' ] |
Traduction injecter dans ma structure.
J'ai trouve un solution qui marche mais reste a savoir si c'est correct.
J'ai bien un tableau de Promesse que je recupere de mes requete HTTP.
Ma structure Map est dans un certain ordre a ne pas changer.
Car mon tableau de promesse est dans le même ordre.
Je fait un recursion sur ma structure Map et injecte le premièr element de la pile.
Ensuite je depile au fur et a mesure dans l'iteration de ma Map:
Voici ce que je fait:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
function myfunctionForTranslate(translatedMap,promises){
let myPromises = promises;
translatedMap.forEach((value,key) => {
if(typeof value === 'object')
{
translatedMap.set(key,myfunctionForTranslate(value,myPromises));
console.log("in object => " + key);
}
else
{
translatedMap.set(key,myPromises[0]);
myPromises.shift();
}
});
return translatedMap;
} |
j'attend ton avis..