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;
}
Au lieu de
return
, vous devez utilisercallbacks
car dans les opérationsasynchronous
,return
n'attend pas leI/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);
}
});
}