如何理解节点中的回调和async.parallel

时间:2014-04-24 01:01:53

标签: javascript node.js asynchronous callback

我对JavaScript和回调都很陌生,所以如果这是一个愚蠢的问题我很抱歉。基于async docs for parallel,我想出了基于文档执行预期方式的示例代码:

async = require('async')

async.parallel([
    function(callback){
        setTimeout(function(){
          callback(null, 'one');
        }, 800);
    },
    function(callback){
      setTimeout(function(){
        callback(null, 'two');
      }, 100);
    }
],
    function(err, results){
      console.log(results)
    })       

使用node foo.js运行此操作会打印结果数组['one', 'two'],因为文档会指示它。我不明白的是这是如何工作的:当你将callback作为参数传递给每个函数然后callback被称为callback(null, res)时,究竟是什么被称为她吗?我实际上没有定义任何函数回调,也没有将任何类型的操作回调函数作为参数传递,但一切都神奇地工作正常。我完全忽略了这一点吗?或者这实际上是async

的幕后魔术

1 个答案:

答案 0 :(得分:2)

通过callback到任务功能的那个,异步模块 。它是一个特殊的函数,模块传递给你的任务函数,当被调用时,它会检查是否还有更多的任务。

这与async中的内容类似:

function myParallel(tasks, finalcb) {
  var tasksLeft = tasks.length,
      results = [],
      ignore = false;

  function callback(err, result) {
    if (ignore) return;
    if (err) {
      ignore = true;
      finalcb && finalcb(err);
    } else if (--tasksLeft === 0) {
      ignore = true;
      finalcb && finalcb(null, results);
    } else
      results.push(result);
  }

  tasks.forEach(function(taskfn) {
    taskfn(callback);
  });
}

myParallel([
  function(callback) {
    setTimeout(function() {
      callback(null, 'one');
    }, 800);
  },
  function(callback) {
    setTimeout(function() {
      callback(null, 'two');
    }, 100);
  }
], function(err, results){
  console.log(results)
});