Javascript 业力、幻影和es6承诺
我正在编写一个使用新es6承诺的JavaScript库。我可以在Firefox中测试这个库,因为承诺已经定义。然而,当我试图用Karma和PhantomJS测试代码时,我得到了一个错误Javascript 业力、幻影和es6承诺,javascript,phantomjs,karma-runner,es6-promise,karma-mocha,Javascript,Phantomjs,Karma Runner,Es6 Promise,Karma Mocha,我正在编写一个使用新es6承诺的JavaScript库。我可以在Firefox中测试这个库,因为承诺已经定义。然而,当我试图用Karma和PhantomJS测试代码时,我得到了一个错误找不到变量:Promise.。我猜这是因为PhantomJS浏览器还不支持es6承诺 我如何配置因果报应来为承诺注入polyfill?这应该对你有所帮助。根据它,您似乎应该尝试将PhantomJS2与ES6结合使用。 你们也可以看看这个项目,它比你们的项目更接近主题 我希望它能对您有所帮助您只需安装以下装置即可安装
找不到变量:Promise.
。我猜这是因为PhantomJS浏览器还不支持es6承诺
我如何配置因果报应来为承诺注入polyfill?这应该对你有所帮助。根据它,您似乎应该尝试将PhantomJS2与ES6结合使用。
你们也可以看看这个项目,它比你们的项目更接近主题
我希望它能对您有所帮助您只需安装以下装置即可安装Babel polyfill: 然后在
karma.conf.js
的files
部分的源文件和测试文件之前包含polyfill文件:
files: [
'node_modules/babel-polyfill/dist/polyfill.js',
'index.js', //could be /src/**/*.js
'index.spec.js' //could be /test/**/*.spec.js
],
除非您知道您的所有目标浏览器都支持承诺,否则您可能也希望将此polyfill应用于您发布的构建
如果你真的很喜欢冒险,可以使用Browserify将文件拉入,使测试更加模块化,然后使用Babelify将ES6传输到ES5。我创建了一个。可以用于使用ES6功能的文件。安装它与
npm安装--保存开发人员karma babel预处理器
然后添加并指定要预处理的文件karma.conf
:
preprocessors: {
"src/**/*.js": ["babel"],
"test/**/*.js": ["babel"]
},
对于Babel 6,我们需要安装
Babel polyfill
以支持promise
npm install --save-dev babel-polyfill
这一点在美国有很好的记录
正如作者正确指出的,它不能承认es6承诺。为了加载es6 promise模块,可以借助webpack.ProvidePlugin加载,并在webpack的插件阵列中进行配置
plugins: [
new webpack.ProvidePlugin({
'Promise': 'es6-promise'
})
]
这似乎对我有用 快速测试表明PhantomJS 2.0.1-dev不支持承诺。我有一个类似的问题,但在包含polyfill之后,承诺似乎永远无法解决,这里有一个要点:任何人都知道为什么承诺永远不会运行。然后“?@Chris您的问题没有考虑所有相关的问题。我没法说出你们的要点,但看起来你们的问题可能和角度有关。不要将Promise polyfill与Angular一起使用–您需要使用内置的$q实现(否则它将无法与摘要循环一起使用)。如果您想构建一个已解析的承诺,请使用
$q.when(某些对象)
。你真的需要在SO上打开一个新的问题,但是在这里发布链接,我会看一看。@spikeheap是的,我在整个应用程序中切换到$q,它工作了。感谢您查看。与babel一起使用,在karma.conf.js中有它的配置部分,以及前处理器:{./tests/***.js',:['webpack']}
就足够了吗?当webpack在正常情况下添加polyfill时,我为什么还要手动添加它呢?嗨@Henrik,听起来你已经回答了自己的问题;)。这个问题/答案对于大量不使用Webpack的人很有用,但你是对的:如果你使用的系统已经为你进行了多边形填充,不要手动添加多边形填充。不幸的是,这不起作用。我已经在使用babel预处理器
,Karma找不到Promise.resolve()
函数。babel polyfill的为我解决了这个问题。
files: [
'node_modules/babel-polyfill/dist/polyfill.js',
....
]
plugins: [
new webpack.ProvidePlugin({
'Promise': 'es6-promise'
})
]