JS Attendre la callback avant de retourner le résultat d'une fct

Fermé
yolo - Modifié par jordane45 le 17/08/2016 à 15:27
 yolo - 17 août 2016 à 17:26
Bonjour,

Je suis plutôt débutant en JS. Je souhaite attendre le résultat de la callback dans solrClient.search avant de retourner le résultat final. Sauf qu'en l'état actuel le retour se fait avant la fin du traitement dans les conditions définies dans la callback.

Voici le code associé :
function updateMessage(input, response) {
  response.output.text = "ceci est une mauvaise réponse";
  if(!cond1){
   return response;
  } else {
   query.q(input.input.text);
   solrClient.search(query, function(err, searchResponse) {
  if(err) {
    console.log('Error searching for documents: ' + err);
  }
  else {
    console.log('Found ' + searchResponse.response.numFound + ' documents.');
    response.output.text('First document: ' + JSON.stringify(searchResponse.response.docs[0], null, 2));
  }
   });
  }
  return response;
}

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.


NB: Javascript n'est pas JAVA ... la discussion est déplacée dans le bon forum !


Merci de votre aide !

2 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
Modifié par Pitet le 17/08/2016 à 16:59
Effectivement la "bonne manière" pour récupérer le résultat est d'appeler une autre fonction de callback qui sera passée en paramètre de ta première fonction, par exemple comme ceci :
function updateMessage(input, response, callback) {
 response.output.text = "ceci est une mauvaise réponse";
 if(!cond1){
  return response;
 } else {
  query.q(input.input.text);
  solrClient.search(query, function(err, searchResponse) {
   if(err) {
    console.log('Error searching for documents: ' + err);
   } else {
    console.log('Found ' + searchResponse.response.numFound + ' documents.');
    response.output.text('First document: ' + JSON.stringify(searchResponse.response.docs[0], null, 2));
   }
   
   callback(response);
  });
 }
}


Dans ce cas, l'appel à ta fonction ne se fait pas comme ceci :
var returnResponse = updateMessage(input, response);


mais comme ceci :
updateMessage(input, response, function(resturnResponse) {
    // on peut utiliser ici la retour de la recherche : returnResponse 
});


Source : https://stackoverflow.com/questions/5010288/how-to-make-a-function-wait-until-a-callback-has-been-called-using-node-js

Une autre solution qui semble correspondre exactement à ton problème en utilisant les "promises" : https://stackoverflow.com/questions/26566535/nodejs-solrclient-how-to-wait-for-response
1
J'ai le même problème, le return est considéré comme étant celui de fonction search et non updateMessage
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
17 août 2016 à 16:34
Salut,

Et en déplancant le "return response;" à la fin de la fonction de callback ?

Bonne journée,
0
il considère que c'est le return de la fonction solrClient.search et non de updateMessage
0