2016-04-15 28 views
0

我正在编写一个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,如果这能帮助

回答

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它适用此修复程序来说明问题的问题,原来的要点。

相关问题