2013-11-25 100 views
19

我需要从两个Web服务器请求数据。任务是独立的;因此,我正在使用aync.parallel。现在我只在自己的网页上写上'abc','xyz'和'Done'。了解Node.JS async.parallel

由于任务在同一时间执行,我可以遇到一个奇怪的输出?例如,

xab 
cyz 

的代码。

var async = require('async'); 

function onRequest(req, res) { 
    res.writeHead(200, { 
     "Content-Type" : "text/plain" 
    }); 

    async.parallel([ function(callback) { 
     res.write('a'); 
     res.write('b'); 
     res.write('c\n'); 
     callback(); 
    }, function(callback) { 
     res.write('x'); 
     res.write('y'); 
     res.write('z\n'); 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("\nDone!"); 
    }); 

} 

var server = require('http').createServer(onRequest); 
server.listen(9000); 
+1

写入'res'的顺序取决于哪个async.parallel任务首先完成,但是因为任务是独立的,而不是顺序应该无关紧要。 – Bulkan

+0

@Bulkan,谢谢。但“并行”似乎不能正常工作。请阅读[一个新问题](http://stackoverflow.com/questions/20186787/node-js-async-parallel-doesnt-wait-until-all-the-tasks-have-completed)。 –

回答

37

如果你想在其结果的打印顺序绝对肯定,你应该通过callbacks传递数据(abc\nxyz\n)(第一个参数是错误)和处理/写出来在最后的async.parallel回调的results的说法。

async.parallel([ 
    one: function(callback) { 
     callback(null, 'abc\n'); 
    }, 
    two: function(callback) { 
     callback(null, 'xyz\n'); 
    } 
], function(err, results) { 
    // results now equals to: [one: 'abc\n', two: 'xyz\n'] 
}); 
+0

我可以传递参数,但我应该在并行函数内执行长操作 –

+0

我假设你正在做一些长操作来获取两个字符串(可能来自数据库),建议分离用于检索数据的代码(并行)和处理('res.write')它(顺序)。 –

+0

这是天才,谢谢 –