如何使浏览器onComplete处理程序等待我的插件完成?

时间:2016-04-15 11:24:34

标签: browserify

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

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

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

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

有什么想法吗?

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

1 个答案:

答案 0 :(得分:0)

我找到了一个使用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,将此修复程序应用于说明问题中问题的原始要点。