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);
});
0
demandé sur kobesin 2014-05-20 14:32:03

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);
});
3
répondu Ben 2015-03-16 21:27:15

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');
1
répondu Jarema 2014-05-20 14:09:57