2014-10-17 51 views
4

我正在尝试创建一个最小的示例,在那里我可以完成上面描述的内容。为此,这里是我的一个小例子,到底哪里,我想在输出将参数传递给node.js中的async.parallel

负1,看试图为-1

加2一个是3

这是我的代码。

var async = require('async'); 
var i, args = [1, 2]; 
var names = ["negative", "plusOne"]; 

var funcArray = [ 
    function negative(number, callback) { 
     var neg = 0 - number; 
     console.log("negative of " + number + " is " + neg); 
     callback(null, neg); 
    }, 
    function plusOne(number, callback) { 
     setTimeout(function(number, callback) { 
      var onemore = number + 1 
      console.log("plus one of " + number + " is " + onemore); 
      callback(null, onemore); 
     }, 3000); 
    }]; 

var funcCalls = {}; 
for (i = 0; i < 2; i++) { 
    funcCalls[names[i]] = function() { 
     funcArray[i].apply(this, args[i]); 
    }; 
} 

async.parallel(funcCalls, function(error, results) { 
    console.log("Parallel ended with error " + error); 
    console.log("Results: " + JSON.stringify(results)); 
}); 

请注意,我传递一个命名对象async.parallel以及。传递一个数组(并且完全忘记名字)也可以作为我的答案,但我更感兴趣的是传递这样一个对象。

关于实现我的目标的任何想法?

+0

你为什么要这么做? – thefourtheye 2014-10-17 18:32:52

+0

如果这是你需要的,你可以用'f.name'来得到一个函数的名字......但是我不知道我明白你想要做什么。 – elclanrs 2014-10-17 18:33:24

+0

正如标题所示,我希望将不同的参数传递给我使用async.parallel调用的每个函数。所以,我想并行运行'negative(1,cb)'和'plusOne(2,cb)'。有什么意义? 这个想法是,在一些同伴注册期间,我想要在不同的集合中并行创建一些对象。我可以写下我打算传递给这个函数的(单个)参数,然后用async.parallel调用它们。它会使代码更清洁。有道理我想说什么? – MightyMouse 2014-10-17 18:36:53

回答

13

为什么不到bind的初始值?那么你会有这样的事情:

async.parallel([ 
    negative.bind(null, -1), 
    plusOne.bind(null, 3) 
], function(err, res) { 
    console.log(err, res); 
}); 

当然,你可以生成各种参数的列表。这只是为了给出一个简化方法的想法。

+0

看起来非常好。我有一个印象,我尝试“绑定”,但显然我没有做到正确。 :)当然,我接受。感谢您的时间。 – MightyMouse 2014-10-17 18:49:43

+2

没有probs。记住传递上下文非常重要(例如,'null'为'this'),否则它将无法工作。 'bind'与'async'很好地结合在一起。 – 2014-10-17 18:52:24

+0

非常感谢! :) – MightyMouse 2014-10-17 22:24:36

0

相反,你可以使用async.apply

async.parallel(
[ 
    async.apply(negative, -1), //callback is automatically passed to the function 
    async.apply(positive, 3) 
], 
(error, results) => { 
console.log(error, results); 
})