【问题标题】:how to understand callbacks and async.parallel in node如何理解节点中的回调和 async.parallel
【发布时间】:2014-06-09 02:12:43
【问题描述】:

我对 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 的幕后魔力?

【问题讨论】:

    标签: javascript node.js asynchronous callback


    【解决方案1】:

    不是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)
    });
    

    【讨论】:

      猜你喜欢
      • 2018-08-23
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 2020-01-14
      • 2017-05-03
      • 2019-01-29
      相关资源
      最近更新 更多