node.js如何执行多任务功能

时间:2014-11-11 06:41:52

标签: javascript node.js

我将node.js用于我的网络服务器。当用户请求页面时,我需要调用3个不同的函数,每个函数返回与用户相关的不同数据集,并将它们显示在一个页面中。

  1. 用户数据
  2. 用户订单
  3. 计算数据(类似的购买项目)
  4. 目前,我调用函数#1,当回调发生时,我调用函数#2,当回调发生时,最后调用函数#3。之后我发送回复。

    有没有办法可以同时/同时请求所有3个函数,多任务,然后将结果返回给响应?

    谢谢...

2 个答案:

答案 0 :(得分:3)

是的,您可以使用nodejs的asynchttps://www.npmjs.org/package/async)模块以非常简单的方式完成此操作。

使用async.parallelhttps://github.com/caolan/async#parallel),您可以异步执行多个函数,并在最终回调中将所有结果存入数组中,
像这样..(例如来自文档)

async.parallel([
    function(callback){
        setTimeout(function(){
            callback(null, 'one');
        }, 200);
    },
    function(callback){
        setTimeout(function(){
            callback(null, 'two');
        }, 100);
    }
],
// optional callback
function(err, results){
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.
});

答案 1 :(得分:0)

在这种情况下,正确的答案是使用asynclike Yogesh Katri mentioned。它的使用和阅读非常简单。

如果您需要更多灵活性,我建议您查看Q,它适用于promise对象。这使您可以使用通用实现来处理代码中的异步调用。

// Create for each task a _promise_, execute each of them in parallel 
// and let them `resolve` their promise in the callback while you're 
// waiting on the _main_ flow with the `Q.all` method.

var Q = require('q');

// Wrapper to create promises

function promiseMe(fn) {
   var defer = Q.defer();
   fn(defer);
   return defer.promise;
}

// Create a fake async task (via setTimeout)

function fakeTask(desc, delay, result) {
   return promiseMe(function(defer) {
     console.log('Executing task ' + desc + ' ...');

     setTimeout(function() {
       console.log('Done executing task ' + desc + '.');
       defer.resolve(result);
       }, delay);
     });  
}

// Create an array of promises for all our tasks

var promises = [
   fakeTask('user data', 2000, { user: 'hansch' }),
   fakeTask('user orders', 1000, [ { order: 1 }, { order: 2 } ]),
   fakeTask('something else', 3000, { magic: true })
];

console.log('Waiting for all tasks to complete ...');

// Tell Q to wait for all promises to resolve

Q.all(promises).then(function(result) {
   console.log('All done.');

   console.log('User data', result[0]);
   console.log('User orders', result[1]);
   console.log('Something else', result[2]);
});