如何在node.js和express.js中创建非阻塞异步函数

时间:2014-05-20 10:32:03

标签: node.js express

我通过WebMatrix创建了express.js示例。我想创建一个api来获取myfunction的结果。如果第一个请求案例很复杂并且花费很多时间并且第二个请求案例很简单,则第二个请求必须等待第一个请求完成。我可以做第二个请求比第一次请求更快地返回数据的事情吗?

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 个答案:

答案 0 :(得分:3)

您可以使用async来实现:

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);
});

答案 1 :(得分:1)

如果您愿意,您不必使用任何外部库。你可以这样做:

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');

你可以测试一下,然后看看,&#34; 2&#34;将在1和3之后打印机。 希望它有所帮助。

PS您也可以使用setInterval或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');