2015-04-01 23 views
32

Tôi đang viết một thư viện JavaScript sử dụng lời hứa es6 mới. Tôi có thể kiểm tra thư viện trong Firefox vì lời hứa được xác định. Tuy nhiên, khi tôi thử kiểm tra mã của mình bằng Karma và PhantomJS, tôi gặp lỗi Can't find variable: Promise.. Tôi đoán điều này là do trình duyệt PhantomJS không hỗ trợ các lời hứa es6.Karma, PhantomJS và es6 Hứa hẹn

Làm cách nào tôi có thể định cấu hình Karma để mang lại lời hứa cho các lời hứa?

Trả lời

0

Điều này thread sẽ giúp bạn. Theo đó, có vẻ như bạn nên thử dùng PhantomJS2 với ES6. Bạn cũng có thể xem dự án this, đối xử với chủ đề gần hơn đối tượng của bạn.

Tôi hy vọng nó có thể giúp bạn

+3

Kiểm tra nhanh cho thấy PhantomJS 2.0.1-dev không hỗ trợ lời hứa. –

63

Bạn có thể kéo trong polyfill Babel bằng cách cài đặt Babel Polyfill:

npm install --save-dev babel-polyfill 

và sau đó bao gồm các tập tin polyfill trước nguồn và kiểm tra các tập tin trong phần files của của bạn karma.conf.js:

files: [ 
    'node_modules/babel-polyfill/dist/polyfill.js', 
    'index.js', //could be /src/**/*.js 
    'index.spec.js' //could be /test/**/*.spec.js 
], 

Trừ khi bạn biết rằng tất cả trình duyệt mục tiêu của bạn đều hỗ trợ Promi ses, bạn có thể muốn áp dụng polyfill này để xây dựng phát hành của bạn quá.

Nếu bạn cảm thấy thực sự mạo hiểm, bạn có thể sử dụng Browserify để kéo tệp vào để làm cho thử nghiệm của bạn thêm mô-đun và sau đó sử dụng Babelify để chuyển ES6 thành ES5. Tôi đã tạo một sample project with these and a working test involving a Promise (running on PhantomJS2) for reference.

+0

Tôi đang gặp vấn đề tương tự nhưng sau khi bao gồm cả polyfill, Promise không bao giờ có vẻ giải quyết, đây là một ý chính: https://gist.github.com/Kikketer/1646eccdaff76944b358 Bất cứ ai cũng có một đầu mối tại sao Lời hứa sẽ không bao giờ chạy nó ' .sau đó' ? – Chris

+0

@Chris vấn đề của bạn không xem xét tất cả các liên quan. Tôi không thể chạy được ý chính của bạn, nhưng có vẻ như bạn đang gặp vấn đề có lẽ liên quan đến Angular. Không sử dụng Promf polyfill với Angular - bạn cần sử dụng việc cài đặt $ q được cài đặt sẵn (nếu không nó sẽ không hoạt động với chu trình digest). Nếu bạn muốn xây dựng một lời hứa đã được giải quyết, hãy sử dụng '$ q.when (some_object)'. Bạn thực sự cần phải mở một câu hỏi mới trên SO, nhưng đăng liên kết ở đây và tôi sẽ xem xét. – spikeheap

+0

@spikeheap yea Tôi chuyển sang $ q trong suốt ứng dụng và nó hoạt động. Cảm ơn vì đã xem nó. – Chris

0

Bạn có thể sử dụng karma-babel-preprocessor cho các tệp sử dụng tính năng ES6. Cài đặt nó với

npm install --save-dev karma-babel-preprocessor

và sau đó thêm xác định những tập tin cần được xử lý trước bạn karma.conf:

preprocessors: { 
     "src/**/*.js": ["babel"], 
     "test/**/*.js": ["babel"] 
    }, 
+0

Thật không may điều này không hoạt động. Tôi đã sử dụng 'babel-preprocessor' và Karma không thể tìm thấy hàm' Promise.resolve() '. 'Babel-polyfill' đã khắc phục vấn đề cho tôi. – Jelle

10

Đối với Babel 6, chúng ta cần phải cài đặt babel-polyfill để hỗ trợ lời hứa.

 
npm install --save-dev babel-polyfill 

và thêm một dòng trong karma.conf.js trong files phần

files: [ 
    'node_modules/babel-polyfill/dist/polyfill.js', 
    .... 
] 

Nó cũng ghi nhận ở https://github.com/babel/karma-babel-preprocessor#polyfill

0

như một cách chính xác chỉ ra bởi tác giả nó không phải là có thể nhận ra lời hứa es6. Để tải nó, mô-đun lời hứa es6 có thể được nạp với sự trợ giúp của webpack.ProvidePlugin và cấu hình nó bên trong mảng plugin của webpack.

plugins: [ 
     new webpack.ProvidePlugin({ 
      'Promise': 'es6-promise' 
     }) 
    ] 

Điều này có vẻ phù hợp với tôi!

Các vấn đề liên quan