我发现这段代码说我可以异步运行一些db查询。
var queries = [];
for (var i=0;i <1; i++) {
queries.push((function(j){
return function(callback) {
collection.find(
{value:"1"},
function(err_positive, result_positive) {
result_positive.count(function(err, count){
console.log("Total matches: " + count);
positives[j] = count;
callback();
});
}
);
}
})(i));
}
async.parallel(queries, function(){
// do the work with the results
}我不明白什么是回调函数,它是怎么定义的?第二,在queries.push中,它传递函数(J)这个函数中的j是什么,这个(i)是什么
queries.push((function(j){})(i));我完全搞不懂这段代码是如何工作的?
发布于 2013-02-16 15:59:33
该循环正在准备一组与async.parallel()的tasks几乎相同的函数。
在循环之后,如果它当前只迭代一次,queries将类似于:
var queries = [
function (callback) {
collection.find(
// etc.
);
}
];并且,对于每个额外的迭代,都会添加一个新的function (callback) { ... }。
什么是回调函数?它是如何定义的?
callback只是每个函数的命名参数。它的值将由async.parallel()定义为另一个function,当被调用时,它允许async知道每个任务何时完成。
queries.push中的第二个函数,它传递函数(J),这个函数中的j是什么,这个(i)是什么
queries.push((function(j){})(i));
(function(j){})(i)是一个以j作为命名参数的Immediately-Invoked Function Expression (IIFE),它通过i作为传递的参数立即被调用,并返回一个新的function (callback) {},该The将被push到queries
queries.push(
(function (j) {
return function (callback) {
// etc.
};
})(i)
);IIFE的目的是创建一个closure --一个带有局部变量的词法作用域,该作用域“粘住”在作用域中定义的任何function。这允许每个function (callback) {}都有自己的j,只有一个值i (因为i将随着for循环的继续而继续改变值)。
发布于 2013-02-16 12:22:40
回调是最酷的特性之一。回调只是另一个普通的函数。实际上,您可以将函数本身作为参数传递到另一个函数中。假设foo()函数做了一些事情。在foo()执行完之后,您可能想立即执行一些其他的东西。因此,为了实现这一点,您定义了一个函数bar(),并将此函数作为参数传递给函数foo()!
function foo(callback){
// do something
callback();
}
function bar(){
// do something else
}
foo(bar());
//here we can see that a function itself is being passed as a param to function foo.想要更多地了解here的正确链接。
和
queries.push((function(j){})(i));在javascript中,这是调用函数的另一种方式。
function(){
// do something.
}();您实际上不需要定义函数名,并且可以在没有名称的情况下直接调用它。您甚至可以将参数传递给它。
function(a){
alert(a)'
}(10);https://stackoverflow.com/questions/14906806
复制相似问题