Comment créer une fonction asynchrone non-bloquante dans le noeud.js et express.js
je crée express.exemple js par WebMatrix. Je veux créer une api pour obtenir le résultat de myfunction. Si le premier cas de requête est compliqué et passe beaucoup de temps et que le second cas de requête est simple, la seconde requête doit attendre la fin de la première requête. Puis-je faire quelque chose pour que la seconde requête puisse renvoyer des données plus rapidement que la première requête?
app.post('/getData', function(req, res) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
var case= req.body.case;
var json = myfunction(case);
res.json(json);
});
2 réponses
vous pouvez utiliser async pour obtenir que:
var async = require('async');
async.waterfall([
function(callback){ // first task
// process myCase (don't use case, it's reserved word),
// then pass it to your next function
callback(null, myCase); // 1st argument: null means no error
// if error, pass error in 1st arg
// so that 2nd function won't be
// executed
},
function(myCase, callback){ // 2nd task
// use argument 'myCase' to populate your final json result (json)
// and pass the result down in the callback
callback(null, json);
}
], function (err, json) {
// the argument json is your result
res.json(json);
});
si vous le souhaitez, vous n'avez pas à utiliser de bibliothèques externes. Vous pouvez faire par exemple quelque chose comme ceci:
console.log('1');
function async(input, callback) {
setTimeout(function() {
//do stuff here
for (var i = 0; i < input; i++) {
//this takes some time
}
//call callback, it may of course return something
callback('2');
}, 0);
}
async('10000000', function(result) {
console.log(result);
});
console.log('3');
vous pouvez le tester, et voir, que" 2 " sera imprimante après 1 et 3. Espérons qu'il a aidé.
PS Vous pouvez également utiliser la bibliothèque setInterval, ou Underscore:
var _ = require('underscore');
console.log('1');
function async(input, callback) {
_.defer(function() {
//do stuff here, for ie - this time-consuming loop
for (var i = 0; i < input; i++) {
//this takes some time
}
//call callback, it may of course return something
callback('2');
});
}
async('10000000', function(result) {
console.log(result);
});
console.log('3');