javascript - 与可变参数回调异步并行

标签 javascript async.js

我对这段代码不太满意:

async.parallel([
  getThing1,
  getThing2,
  getThing3
], function(err, responses) {
  next.ifError(err);

  var thing1 = responses[0],
      thing2 = responses[1],
      thing3 = responses[2];

  // business
});

我希望它看起来像这样,按要求:

async.parallel([
  getThing1,
  getThing2,
  getThing3
], function(err, thing1, thing2, thing3) {
  next.ifError(err);

  // business
});

这就是我最终得到的结果:

async.variadic = function(fn) {
  return function(err, responses) {
    return fn.bind(this, err).apply(this, responses);
  }
}

async.parallel([
  getThing1,
  getThing2,
  getThing3
], async.variadic(function(err, thing1, thing2, thing3) {
  next.ifError(err);

  // business
}));

问题:

我在 fn.bind(this, err).apply(this,response); 中正确使用了 this 吗?

是否有现有的方法可以使用异步库来执行此操作?

<小时/>

更新:这是实现此目的的不同方法:

async.variadic = (function() {
  var _async = {};
  _async.prototype = async;
  _async.parallel = function(tasks, callback) {
    return async.parallel(tasks, function(err, responses) {
      return callback.bind(this, err).apply(this, responses);
    });
  };
  return function() {
    return _async;
  };
})();

async.variadic().parallel([
  getThing1,
  getThing2,
  getThing3
], function(err, thing1, thing2, thing3) {
});

I think I like this one most. Is this a good way to accomplish the task?
<小时/>

这是一个有不同想法的 jsperf:http://jsperf.com/variadic-async

最佳答案

我个人更喜欢第一种方法。 variadic 函数对正在发生的事情知之甚少,并且可以抽象得更多:

function variadic(fn) {
  var self = this;
  return function(err, responses) {
    responses.unshift(err);
    return fn.apply(self, responses);
  }
}

async.variadic = variadic.bind(async);

async.parallel([
    function(cb) {
      cb(null,'1')
    },
    function(cb) {
      cb(null,'2')
    },
    function(cb) {
      cb(null,'3')
    },
], async.variadic(function(err, thing1, thing2, thing3) {
    console.log(this);
    console.log(thing1,thing2,thing3);
  // business
}));

关于javascript - 与可变参数回调异步并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813452/

相关文章:

javascript - nodejs循环async.parallel回调

javascript - 使用异步 js 迭代数组并在回调中执行函数以返回单个结果

mysql - Nodejs-mysql 池连接不适用于异步系列

javascript - 当用户将鼠标悬停在两个 div 之一上时,如何让 div 显示特定图像?

javascript - load-grunt-config 找不到要启动的任务

javascript - 如何为自动登录 Cacti 多次发布 PHP 表单 onload?

javascript - 是什么让 Angular 和 Backbone 与 jQuery 不同?

javascript - 如何从输入元素传递参数

javascript - Promise + async.js