Сообщение от kobezzza
|
Банк полифилов
|
Полифил для промисов там вообще неправильный
Сообщение от jonathantneal/polyfill
|
(function () {
function Promise(resolver) {
var
self = this,
then = self.then = function () {
return Promise.prototype.then.apply(self, arguments);
};
then.fulfilled = [];
then.rejected = [];
function timeout(state, object) {
then.state = 'pending';
if (then[state].length) setTimeout(function () {
timeout(state, then.value = then[state].shift().call(self, object));
}, 0);
else then.state = state;
}
then.fulfill = function (object) {
timeout('fulfilled', object);
};
then.reject = function (object) {
timeout('rejected', object);
};
resolver.call(self, then.fulfill, then.reject);
return self;
}
Promise.prototype = {
'constructor': Promise,
'then': function (onFulfilled, onRejected) {
if (onFulfilled) this.then.fulfilled.push(onFulfilled);
if (onRejected) this.then.rejected.push(onRejected);
if (this.then.state === 'fulfilled') this.then.fulfill(this.then.value);
return this;
},
'catch': function (onRejected) {
if (onRejected) this.then.rejected.push(onRejected);
return this;
}
};
Promise.all = function () {
var
args = Array.prototype.slice.call(arguments),
countdown = args.length;
function process(promise, fulfill, reject) {
promise.then(function onfulfilled(value) {
if (promise.then.fulfilled.length > 1) promise.then(onfulfilled);
else if (!--countdown) fulfill(value);
return value;
}, function (value) {
reject(value);
});
}
return new Promise(function (fulfill, reject) {
while (args.length) process(args.shift(), fulfill, reject);
});
};
window.Promise = Promise;
})();
|
1. then должен возвращать новое обещание
2. нет методов race, reject, resolve
3. из-за использования setTimeout будут лишние задержки по 3-5мс и длительные в бэкграунде
4. возвращенный из then инстанс промиса в качестве value никак не обрабатывается
5. thenable value не поддерживается
6. ...
----
по другим полифилам:
Object.create не фиксит баг в IE9-11
http://webreflection.blogspot.ru/201...re-broken.html.
Заявлена поддержка IE6+, но Object.keys не фиксит баг со стандартными не enumerable свойствами.
DOMTokenList вынесен в отдельный конструктор, но привязан к className, тоесть не имеет смысла вне classList polyfill.
Примитивная реализация Function.prototype.bind, будет неправильно работать с конструкторами.
Element.prototype.matches выдаст неправильный результат, если элемент не находится в DOM-дереве.
getComputedStyle что-то там пытается привести к общему виду в единицах измерения, но одно из самого нужного - opacity никак не фиксит.
Полифилами для Array iteration methods вообще лучше не пользоваться, они проходят по несуществующим свойствам в отличие от стандартных.
----------
Моя подборка полифилов будет получше
https://github.com/Octane/jsCore#polyfill