Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs/async:如何使我的代码易于理解_Javascript_Node.js_Asynchronous - Fatal编程技术网

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

Javascript nodejs/async:如何使我的代码易于理解,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,使用loopbackjs 在我的代码中,我需要以一种非常定制的方式验证属性,所以我不能使用可用的验证器 因此,我想这样使用它: var somevar = "someval"; var anothervar = "anothervar"; MyModel.createme = function(prop1, prop2, prop3, prop4, callback) { async.parallel([ verify_prop1, verify_pro

使用
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) {
   });
 }
然后我要为async创建函数:

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

};
这就是我意识到自己被卡住的地方。如果我在async.parallel调用中内联编写函数,我可以访问函数参数prop1等。但是如何将它们放入我的verify_propX函数中呢?异步pararell的函数签名是否已修复?我把事情复杂化了吗

在另一个文件中,我在异步中使用了三个并行函数,它们变得相当大,所以看起来不太好看,编辑成本也越来越高


因此,我想要一个干净的异步方法分离…我该怎么做呢?

假设四个验证函数可以是同一个函数,只传递给它们一个不同的参数,那么您可以通过从参数中自动创建一个道具数组,然后使用
async.map()
要并行迭代该数组,请执行以下操作:

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) {
 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
    });
}

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

假设四个验证函数可以是同一个函数,只传递一个不同的参数,然后,您可以通过从参数自动创建一个道具数组,然后使用
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
    });
}

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

回调地狱:(异步)代码非常复杂/庞大,回调几乎无法维护甚至开发。我目前正在工作中与之抗争,强制一个异步javascript实现执行Synchronous是非常非常困难的。似乎您应该有一个函数,并通过使用四个prop变量中的每一个调用该函数,而不是编写四个单独的函数。然后,很容易将代码内联,因为它只是一个函数。当然,如果你想要一个外部函数,那么你可以直接调用它,并从内联核心代码中传递适当的prop变量。Callback hell:(异步)代码非常复杂/庞大,回调几乎不可能维护甚至开发。我目前正在工作中与之抗争,强制一个异步javascript实现执行Synchronous是非常非常困难的。似乎您应该有一个函数,并通过使用四个prop变量中的每一个调用该函数,而不是编写四个单独的函数。然后,很容易将代码内联,因为它只是一个函数。如果你想要一个外部函数,然后你可以调用它,并从内联核心代码中传递适当的prop变量。这是一个很好的函数,但我刚刚在一个函数中意识到我需要两个属性:)@faboolous-你很难提供最好的答案,因为你没有向我们展示你在这些函数中尝试做什么。@faboolous-我添加了另一个选项,可以提供您可以使用无限的灵活性。这是一个很好的选项,但我刚刚意识到在一个函数中我需要两个属性:)@faboolous-您不向我们展示您在这些函数中尝试执行的操作,这使您很难提供最佳答案。@faboolous-我添加了另一个选项,为您提供无限的灵活性。