异步回调流控制

时间:2014-11-26 16:51:12

标签: javascript node.js asynchronous callback flow-control

我希望这个异步瀑布功能有更好的流量控制。

async.waterfall([
  async.apply(osxAppIconName, options.appFile),
  function(iconFileName, callback) {
    var existingIcon = path.join(options.iconDirectory, iconFileName);
    return callback(null, existingIcon);
  },
  async.apply(fs.copy, options.iconFile), //automatically puts in existingIcon
  async.apply(osxAppIconTouch, options.appFile),
], callback);

现在我正在使用async.apply注入全局函数参数。在上面这种情况下,我很好,需要existingIcon并将其添加为fs.copy中倒数第二个参数。制作fs.copy个参数options.iconfileexitingIcon,回调[function]。哪个好极了!

但是,我想稍后我需要exitingIcon。假设我将其推入瀑布函数数组。

async.apply(newFunction, existingIcon)

我如何获得existingIcon此功能?全局?管理似乎很头疼!我还认为async.apply函数在加载时正在执行,所以如果我传递一个变量,它将在async.apply执行时使用变量的值。

思考?我有async.switchboard here的提案。哪个试图解决这个问题,但它不起作用。

1 个答案:

答案 0 :(得分:0)

使用async.auto可以很好地解决这个问题,它将函数的结果附加到链中的prop。

return async.auto({
  "icon_name": async.apply(osxAppIconName, options.appFile),
  "copy_icon": ["icon_name",
    function(callback, results) {
      results.existing_icon = path.join(options.iconDirectory, results.icon_name);
      return fs.copy(options.iconFile, results.existing_icon, callback);
    }
  ],
  "touch_icon": ["copy_icon", async.apply(osxAppIconTouch, options.appFile)],
}, callback);

对于承诺,请查看: