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-我添加了另一个选项,为您提供无限的灵活性。