我正在编写一个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,如果有帮助的话
答案 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,将此修复程序应用于说明问题中问题的原始要点。