Webpack编译器实例的Promisification?

4

我正在使用Webpack 2 Node API,并希望使用bluebird使run()方法变为promise。

import Promise from 'bluebird'
import webpack from 'webpack'

const compiler = webpack(config)
const runAsync = Promise.promisify(compiler.run)

runAsync().then(stats => {
  console.log('stats:', stats)
}).catch(err => {
  console.log('err:', err)
})

我遇到的错误是:
[TypeError: self.applyPluginsAsync不是一个函数]
所以我猜想webpack的代码可能与bluebird promisification不兼容。
有没有其他方法可以将webpack的run()方法promisify?
这些回调和if语句都让我感到困扰。
1个回答

4
你需要将编译器作为上下文传递给promisify方法。
const runAsync = Promise.promisify(compiler.run, { context: compiler });

或这样调用:

runAsync.call(compiler).then(stats => {...

来自Bluebird的文档:

请注意,如果节点函数是某个对象的方法,则可以将该对象作为第二个参数传递,如下所示:

var redisGet = Promise.promisify(redisClient.get, {context: redisClient});
redisGet('foo').then(function() {
    //...
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接