Подтвердить что ты не робот

Добавление обещания polyfill к ES6

У меня есть проект React, написанный на ES6. Он скомпилирован с использованием Babel и работает достаточно хорошо. За исключением одного обещания (из многих!), Которое действует только в IE, для которого я уже знаю, не поддерживает promises. Поэтому я сразу подумал добавить polyfill для поставки promises для IE, но тогда я подумал: "Держись, ты уже пишешь ES6 и не компилируется в ES5 в любом случае?" Кто будет знать лучше, чем SO?
Итак, есть ли смысл добавить в мой проект polyfill, например es6-promise? И если есть, как следует использовать его синтаксически? На данный момент у меня есть только импорт, но я должен, вероятно, реализовать его так же хорошо?

import Promise from 'es6-promise';

Также здесь обещание, которое вызывает проблемы в IE, возможно, у меня есть синтаксическая ошибка, которую я не заметил сам!:)

new SingleObjectResource(DJ_CONST.API.setLanguage)
    .put(null, {language_code: theLanguage})
    .then(
        function() {
            window.location.reload();
        }
    );
4b9b3361

Ответ 1

У меня была такая же ситуация, и я был очень расстроен, так как мне пришлось развернуть производственное приложение. Проблема у меня была с Promises от fetchjs. Это то, что я делаю, чтобы спасти свою жизнь.

npm install --save es6-promise //first install as a dependency & then added in broswerify as dependency.

а затем в моем основном JS файле, justed вызвал этот

   import "es6-promise/auto";

отсюда https://github.com/stefanpenner/es6-promise#auto-polyfill

в основном, его альтернативный синтаксис

require('es6-promise').polyfill();

В принципе, под капотом Метод polyfill() будет исправлять глобальную среду (в данном случае имя Promise) при вызове.

Примечание: я использовал gulp с браузером.

Ответ 2

Я не мог отредактировать свой предыдущий ответ раньше, так как получил комментарий к обзору в ночное время, когда я был в автономном режиме... повторно опубликовал свой ответ со встроенной информацией на отзыв. Спасибо.

Почему бы не использовать bluebird везде? Его быстрее, чем родной promises. И polyfills для IE тоже. И я не работаю для них:).

EDIT:

Использование bluebird вместо обычного обещания -

const Promise = require('bluebird');

1. Добавлены первичные сравнения -

results for 10000 parallel executions, 1 ms per I/O op

file                                     time(ms)  memory(MB)
callbacks-baseline.js                         232       35.86
promises-bluebird-generator.js                235       38.04
promises-bluebird.js                          335       52.08
promises-cujojs-when.js                       405       75.77
promises-tildeio-rsvp.js                      468       87.56
promises-dfilatov-vow.js                      578      125.98
callbacks-caolan-async-waterfall.js           634       88.64
promises-lvivski-davy.js                      653      109.64
promises-calvinmetcalf-lie.js                 732      165.41
promises-obvious-kew.js                      1346      261.69
promises-ecmascript6-native.js               1348      189.29
generators-tj-co.js                          1419      164.03
promises-then-promise.js                     1571      294.45
promises-medikoo-deferred.js                 2091      262.18
observables-Reactive-Extensions-RxJS.js      3201      356.76
observables-caolan-highland.js               7429      616.78
promises-kriskowal-q.js                      9952      694.23
observables-baconjs-bacon.js.js             25805      885.55

Platform info:
Windows_NT 6.1.7601 x64
Node.JS 1.1.0
V8 4.1.0.14
Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz × 4

2. IE Polyfill code -

import Bluebird from 'bluebird';
// Node
global.Promise = Bluebird;
// Browser
window.Promise = Bluebird;

Ответ 3

Хотя вы используете Babel (просто trasiling и не добавляете функциональность), нужны полисы.

Все, что вам нужно сделать, это установить пакет:

npm install --save es6-promise

Внутри webpack.config.js (или везде, где есть настройки вашего веб-пакета, если вы используете webpack)

require('es6-promise').polyfill();

Метод polyfill() будет исправлять глобальную среду (в данном случае имя Promise) при вызове. Дополнительная информация на https://github.com/stefanpenner/es6-promise