如何让 browserify onComplete 处理程序等待我的插件完成?

How can I make browserify onComplete handlers wait for my plugin to finish?

我正在编写一个 browserify 插件,它添加了一个转换,但也需要在最后做一些事情,一旦 browserify 完成了 require 树。实现这个很简单,因为我的插件收到一个 browserify 实例(我称之为 brow),所以我可以 brow.transform(...) 添加我的转换并在最后使用以下内容做更多事情:

brow.on('bundle', function (bundler) {
  bundler.on('end', doMoreAtTheEnd)
})

除一个非常重要的细节外,一切正常。当 browserify 完成时(通过 onComplete 处理程序 brow.bundle(onComplete)),任何其他预期 运行 的处理程序执行得太快(在我的插件完成它的工作之前)。这使得测试我的插件相当困难,例如,因为我在 onComplete 处理程序中编写的断言在我的插件完成其工作之前执行。

我理解为什么会发生这种情况:我的插件和我的断言都使用相同的 onComplete 事件,因此它们将 运行 一个紧接在另一个之前,并且由于我的插件正在执行异步工作,断言 运行太快了)。但我不确定如何在没有极端 hackery 的情况下实现我想要的东西......我当然可以使用 setTimeout,但我试图避免这种情况,原因应该是显而易见的......

有什么想法吗?

更新 我已将我的问题减少到 short gist,如果有帮助的话

我找到了使用 browserify 管道的解决方案。诀窍是使用管道中最后一个阶段(包装)的 flush 回调。

var through = require('through2')
var wrap = brow.pipeline.get('wrap')
wrap.push(through(function (buf, enc, next) {
  // This leaves the chunks unchanged
  this.push(buf)
  next()
}, function (next) {
  // Here I can do some async work
  setTimeout(function () {
    // and call `next` when I'm done
    next()
  }, 1000)
})

我做了 a new gist 将此修复应用于说明问题中的问题的原始要点。