28.03.2014, 05:03
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Promise polyfill
Тут задавали вопрос, что внутри Deferred, а еще нативная поддержка Promise появилась в браузерах. Чтобы окончательно разобраться в «обещаниях», решил свой полифил написать
ES6 Promise polyfill на GitHub, для работы требуется setImmediate.
Реализовано поведение, максимально похожее на native Promise в Chrome и Aurora.
Можно использовать в Nodejs:
var Promise = require('es6-promises');
Установка:
Bower
bower install promises
npm
npm install es6-promises
Последний раз редактировалось Octane, 19.05.2014 в 00:57.
|
|
28.03.2014, 09:56
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
По поводу полифилов. Ты зачем перезаписываешь свойства:
Object.keys = Object.keys || function()..
Это вобще дикость какая-то:
Object(object) !== object
Кстати, может кто пояснить, в каком стандарте писаны методы Array.slice и прочие?
__________________
В личку только с интересными предложениями
|
|
28.03.2014, 10:35
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от Octane
|
В IE8 почему-то не работает
|
Может по тому что мало тестов?
|
|
28.03.2014, 13:11
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Добавлю ссылок:
An open standard for sound, interoperable JavaScript promises—by implementers, for implementers
MDN Promise
---
Object(this).constructor !== Promise
// ->
isPromise(object)
-
такие штуки тоже не люблю
var results = Array(promises.length);
на мой взгляд new надо писать для наглядности
-
ну и по возможности я бы запихнул функции
function nextResolve(data) {
function nextReject(error) {
function resolve(data) {
function reject(error) {
в прототип как приватные (чтобы не создавались каждый раз)
-
а в целом выглядит симпатично
Еще я вспомнил, что у тебя была тема про асинхронность. Так вот setImmediate там бы вписалась очень хорошо)
---
Сообщение от danik.js
|
Кстати, может кто пояснить, в каком стандарте писаны методы Array.slice и прочие?
|
предположу, что ни к каком. Это чтобы каждый раз из прототипа не брать, насколько я понимаю.
Сообщение от danik.js
|
Это вобще дикость какая-то:
Object(object) !== object
|
я за isObject(value)
---
GOD, пошел отсюда далеко и надолго
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
28.03.2014, 16:47
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от danik.js
|
По поводу полифилов. Ты зачем перезаписываешь свойства:
Object.keys = Object.keys || function()..
|
Что изменится от того, что keys станет enumerable? Ну и вообще я методы побыстрому навыдергивал в пример отсюда, там есть проверка.
Сообщение от nerv_
|
Сообщение от danik.js
|
Кстати, может кто пояснить, в каком стандарте писаны методы Array.slice и прочие?
|
предположу, что ни к каком. Это чтобы каждый раз из прототипа не брать, насколько я понимаю.
|
Array generic methods
В Aurora 29
Array.slice.toString()
"function slice() {
[native code]
}"
Сообщение от nerv_
|
Сообщение от danik.js
|
Это вобще дикость какая-то:
Object(object) !== object
|
я за isObject(value)
|
хз Object(object) === object стандартная проверка, сто лет так делаю, до этого никто не удивлялся
http://kangax.github.io/es5-compat-table/
http://kangax.github.io/es5-compat-table/es6/
http://kangax.github.io/es5-compat-table/non-standard/
http://people.mozilla.org/~jorendorf...ototype-object
не нахожу здесь Object.isObject или чего-то подобного, в глобале создавать такую функцию не хочу, а с неймспейсом запись не намного короче будет. Мне больше нравится запись if (Object(arg).length) , чем if (isObject(arg) && arg.length) .
Object.is не подходит, потому что Object.is(null, null) → true . Поэтому не вижу особой необходимости создавать isObject для полифила, в библиотеке или фреймворке — без проблем.
Сообщение от nerv_
|
Object(this).constructor !== Promise
// ->
isPromise(object)
|
Здесь не просто this.constructor , потому что в strict режиме this может быть undefined.
Да isPromise добавлю, думаю ни один раз понадобится, там надо разобраться, что происходит, когда в дженерики promise передают. Или на this instanceof Promise заменю.
Сообщение от nerv_
|
ну и по возможности я бы запихнул функции
function nextResolve(data) {
function nextReject(error) {
function resolve(data) {
function reject(error) {
в прототип как приватные (чтобы не создавались каждый раз)
|
попробую, просто сначала кроме onFulfilled, onRejected и lastData еще куча переменных замыкалась (всякие lastError, состояния rejected и fulfilled, и др.), сохранять их все куда то не хотелось
Сообщение от nerv_
|
Еще я вспомнил, что у тебя была тема про асинхронность. Так вот setImmediate там бы вписалась очень хорошо)
|
setImmediate есть в polyfills.js, используется в Promise и реализован почти так же, как в той теме
Последний раз редактировалось Octane, 31.03.2014 в 03:32.
|
|
28.03.2014, 17:41
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Octane
|
Array generic methods
|
Цитата:
|
These are currently not part of ECMAScript standards
|
Ясно. Кстати, неужели Mozilla не могут исправить это положение? Ведь и вправду удобно.
Сообщение от Octane
|
Object(object) === object
|
Первый раз вижу. Ну может погорячился насчет дикости. А кто-нибудь из форумчан еще использует? А в либах мож каких известных?
__________________
В личку только с интересными предложениями
|
|
28.03.2014, 18:06
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от danik.js
|
Ясно. Кстати, неужели Mozilla не могут исправить это положение? Ведь и вправду удобно.
|
Причем запись о дженериках появилась примерно год назад, всякие непонятно зачем нужные copyWithin в стандарте появляются, а действительно полезные методы нет
Сообщение от danik.js
|
Первый раз вижу. Ну может погорячился насчет дикости. А кто-нибудь из форумчан еще использует? А в либах мож каких известных?
|
Кажется я узнал о таком способе когда-то давно из здешней темы по поводу typeof null → "object" . Обсуждали как этот вариант лучше пропускать. В prototype.js полно таких проверок.
Последний раз редактировалось Octane, 28.03.2014 в 18:13.
|
|
29.03.2014, 00:20
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от Octane
|
всякие непонятно зачем нужные copyWithin в стандарте появляются, а действительно полезные методы нет
|
Лучше бы вместо него System.arraycopy из java.util.Arrays добавили
|
|
29.03.2014, 01:18
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Octane
|
Здесь не просто this.constructor, потому что в strict режиме this может быть undefined.
|
я про это ничего не говорил. Найди 10 отличий http://learn.javascript.ru/play/K9WRM
Сообщение от Octane
|
setImmediate есть в polyfills.js, используется в Promise и реализован почти так же, как в той теме
|
да, я обратил внимание, что хаки для его реализации можно пересчитать, использую пальцы одной руки
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 29.03.2014 в 01:21.
|
|
29.03.2014, 01:53
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
isObject и isPromise нашел)
Последний раз редактировалось Octane, 30.03.2014 в 01:41.
|
|
|
|