我找到了这个代码,它说我可以异步运行一些数据库查询
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));
我完全不知道这段代码是如何工作的?
答案 0 :(得分:1)
循环正在为async.parallel()
准备与tasks
几乎相同的函数数组。
在循环之后,如果它仅在当前迭代一次,queries
将类似于:
var queries = [
function (callback) {
collection.find(
// etc.
);
}
];
并且,对于每个额外的迭代,将添加新的function (callback) { ... }
。
什么是回调函数如何定义?
callback
只是每个函数的命名参数。它的值将由async.parallel()
定义为另一个function
,当被调用时,允许async
知道每个任务何时完成。
在query.push中,第二个是传递函数(j)这里的j是什么,这是什么(i)queries.push((function(j){})(i));
(function(j){})(i)
是一个Immediately-Invoked Function Expression (IIFE),j
作为命名参数,它会立即调用i
传递的参数,并返回一个新的function (callback) {}
被push
queries
编辑:
queries.push(
(function (j) {
return function (callback) {
// etc.
};
})(i)
);
IIFE的目的是创建一个closure - 一个词法范围,其局部变量“卡住”到范围内定义的任何function
。这允许每个function (callback) {}
拥有自己的j
,其单个值为i
(因为i
循环继续,for
将继续更改值。
答案 1 :(得分:0)
回调是最酷的功能之一。回调只是另一个正常的功能。您实际上可以将函数本身作为另一个函数中的参数传递。 假设函数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.
}();
您实际上不需要定义函数名称,可以直接调用它而不需要名称。你甚至可以将params传递给它。
function(a){
alert(a)'
}(10);