也许我还没有弄乱异步范例,但我想做这样的事情:
var exec, start;
exec = require('child_process').exec;
start = function() {
return exec("wc -l file1 | cut -f1 -d' '", function(error, f1_length) {
return exec("wc -l file2 | cut -f1 -d' '", function(error, f2_length) {
return exec("wc -l file3 | cut -f1 -d' '", function(error, f3_length) {
return do_something_with(f1_length, f2_length, f3_length);
});
});
});
};
每次我想添加一个新的shell命令时,保持嵌套这些回调似乎有点奇怪。有没有更好的方法呢?
答案 0 :(得分:7)
正如哈维所说,你可以使用TwoStep。另一方面,我使用Async JS库。您的代码可能如下所示:
async.parallel([
function(callback) {
exec("wc -l file1 | cut -f1 -d' '", function(error, f1_length) {
if (error)
return callback(error);
callback(null, f1_length);
});
},
function(callback) {
exec("wc -l file2 | cut -f1 -d' '", function(error, f2_length) {
if (error)
return callback(error);
callback(null, f2_length);
});
},
function(callback) {
exec("wc -l file3 | cut -f1 -d' '", callback);
}
],
function(error, results) {
/* If there is no error, then
results is an array [f1_length, f2_length, f3_length] */
if (error)
return console.log(error);
do_something_with(results);
});
Async提供了大量其他选择。阅读文档并试一试!请注意,对于f3_length
,我在调用callback
时使用了exec
。您也可以使用其他调用(因此您的代码会更短)。我只是想告诉你它是如何工作的。
答案 1 :(得分:3)
我个人在这些情况下使用TwoStep:
var TwoStep = require("two-step");
var exec, start;
exec = require('child_process').exec;
start = function() {
TwoStep(
function() {
exec("wc -l file1 | cut -f1 -d' '", this.val("f1_length"));
exec("wc -l file2 | cut -f1 -d' '", this.val("f2_length"));
exec("wc -l file3 | cut -f1 -d' '", this.val("f3_length"));
},
function(err, f1_length, f2_length, f3_length) {
do_something_with(f1_length, f2_length, f3_length);
}
);
};
也就是说,那里有大量的流量控制库。我鼓励你尝试一下:https://github.com/joyent/node/wiki/Modules#wiki-async-flow