如何让browserify onComplete处理程序等待我的插件完成?
问题描述:
我正在编写一个browserify插件,它添加了一个转换,但还需要在最后完成一些事情,一旦browserify完成了require树。如何让browserify onComplete处理程序等待我的插件完成?
brow.on('bundle', function (bundler) {
bundler.on('end', doMoreAtTheEnd)
})
这工作,除了罚款:因为我的插件收到browserify实例(我称之为brow
),这样我就可以brow.transform(...)
加我的改造和使用下列末做多实现这个很简单一个非常重要的细节。当browserify完成时(通过onComplete处理程序brow.bundle(onComplete)
),任何其他处理程序都会执行过早(在我的插件完成之前执行它)。这使得测试我的插件相当困难,例如,因为我在onComplete处理程序中写入的断言在我的插件完成其工作之前执行。我知道为什么会发生这种情况:我的插件和我的断言都使用相同的onComplete事件,所以它们会立即在另一个之前运行,并且由于我的插件正在执行异步工作,所以断言运行得太快)。但我不知道如何实现我想要的没有极端的黑客...我可以使用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它适用此修复程序来说明问题的问题,原来的要点。