Показать сообщение отдельно
  #382 (permalink)  
Старый 08.07.2014, 12:05
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от 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

Последний раз редактировалось Octane, 08.07.2014 в 12:56.
Ответить с цитированием