web-dev-qa-db-fra.com

Fonction Javascript renvoyant une valeur indéfinie dans nodejs

J'écris du code pour obtenir des données. J'appelle d'abord **getsomedata** fonction pour obtenir des données et à l'intérieur getsomedata fonction J'appelle une autre fonction getRandomdata pour obtenir des données et les renvoyer à la fonction précédente mais elle renvoie undefined. Mais dans getRandomdata les données pouvaient être vues dans console.log. Dois-je utiliser callbacks?

router.get('/get-data', function (req, res, next) {
    var result = getsomedata(some_parameter);
    console.log(result);   // receiving undefined
    res.send(result);
});

function getsomedata(some_parameter_recieved) {
    var getsomedata = getRandomdata(random_params);
    console.log(getsomedata);    // receiving undefined
    return getsomedata;
}

function getRandomdata(random_params_recieved) {
    // after some calculation 
    console.log(random_data);           // receiving proper data
    return random_data;
}
11
iam

Au lieu de return, vous devez utiliser callbacks car dans les opérations asynchronous, return n'attend pas le I/O opération à terminer.

Callback - En JavaScript, les fonctions d'ordre supérieur peuvent être passées comme paramètres dans les fonctions. Étant donné que JavaSCript est un seul thread, une seule opération se produit à la fois, chaque opération qui va se produire est mise en file d'attente sur un seul thread. De cette façon, les fonctions passées (en tant que paramètre) pourraient être exécutées lorsque le reste de l'opération des fonctions parentes (async) est terminé et que le script peut continuer à s'exécuter en attendant les résultats.

Habituellement, cette fonction callback est transmise comme dernier argument de la fonction.

en utilisant Callbacks:

router.get('/get-data', function(req, res, next) {
  getsomedata(some_parameter, function(result) {
    console.log(result);
    res.send(result);
  });
});

function getsomedata(some_parameter_recieved, callback) {
  getRandomdata(random_params, function(random_data) {
    callback(random_data);
  });
}

function getRandomdata(random_params_recieved, callback) {
  // after some calculation
  callback(random_data);
}

en utilisant Promise:

router.get('/get-data', function(req, res, next) {
  getsomedata(some_parameter, function(result) {
    console.log(result);
    res.send(result);
  });
});

function getsomedata(some_parameter_received, callback) {
  getRandomdata(random_params).then(function(random_data) {
    callback(random_data);
  }).catch(function(e) {
    //handle error here
  });
}

function getRandomdata(random_params_received, callback) {
  return new Promise(function(resolve, reject) {
    // after some calculation
    if (RandomDataGeneratedSuccessfully) {
      resolve(random_data);
    } else {
      reject(reason);
    }
  });
}
30
Rayon