nodejs / async:如何让我的代码易于理解

时间:2015-11-20 01:03:07

标签: javascript node.js asynchronous

使用loopbackjs

在我的代码中,我需要以非常自定义的方式验证属性,因此我无法使用可用的验证器。

因此,我正在考虑像这样使用它:

var somevar = "someval";
 var anothervar = "anothervar";
 MyModel.createme = function(prop1, prop2, prop3, prop4, callback) {
    async.parallel([  
      verify_prop1, 
      verify_prop2,
      verify_prop3,
      verify_prop4
    ], function(err, results) {
   });
 }

然后我打算为异步创建函数:

//local methods 
var verify_prop1 = function(callback) {

};

这是我意识到自己陷入困境的地方。如果我在async.parallel调用中内联编写函数,我可以访问函数参数prop1等。但是如何将它们放入我的verify_propX函数中呢?异步pararell的函数签名是否已修复?我过分复杂了吗?

在另一个文件中,我在异步中使用了三个并行函数,它们非常大,所以它看起来不太好,编辑也变得昂贵。

所以我想要一个干净的异步方法分离......我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

async.parallel([  
    async.apply(verify_prop1, prop1), 
    async.apply(verify_prop2, prop2),
    async.apply(verify_prop3, prop3),
    async.apply(verify_prop4, prop4)
  ], function(err, results) {

答案 1 :(得分:2)

假设四个验证函数可以是相同的函数,只有一个不同的参数传递给它们,那么你可以通过从参数自动创建一个道具数组然后使用async.map()迭代来干掉它。该数组并行:

 var somevar = "someval";
 var anothervar = "anothervar";
 MyModel.createme = function(prop1, prop2, prop3, prop4, callback) {
    async.map([].slice.call(arguments, 0, 4), function(item, done) {
        // insert code here to verify the prop passed here as item

        // call done(null, result) when the proccesing is done
        done(null, result);
    }, function(err, results) {
        // array of data here in results
    });
 }

由于您并未真正指定需要传递给工作函数的内容,并且您的注释表明某些函数需要多个prop参数,因此您可以混合使用内联函数和外部函数调用。这使您可以将功能的内容放在外部函数中,但是您可以在内联函数中本地进行设置,您可以访问所有参数:

var somevar = "someval";
var anothervar = "anothervar";
MyModel.createme = function (prop1, prop2, prop3, prop4, callback) {
    async.parallel([
        function (done) {
            verifyA(prop1, prop2, done);
        },
        function (done) {
            verifyB(prop3, done);
        },
        function (done) {
            verifyC(prop2, prop4, done);
        }
    ], function (err, results) {
        // everything done here
    });
}

通过这种方式,您可以以任何方式构建并行操作,并为每个操作传递任意数量的参数。