Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.03.2014, 05:03
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 28.03.2014, 09:56
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

По поводу полифилов. Ты зачем перезаписываешь свойства:
Object.keys = Object.keys || function()..

Это вобще дикость какая-то:
Object(object) !== object


Кстати, может кто пояснить, в каком стандарте писаны методы Array.slice и прочие?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 28.03.2014, 10:35
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от Octane
В IE8 почему-то не работает
Может по тому что мало тестов?
Ответить с цитированием
  #4 (permalink)  
Старый 28.03.2014, 13:11
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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, пошел отсюда далеко и надолго
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 28.03.2014, 16:47
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 28.03.2014, 17:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Octane
Array generic methods
Цитата:
These are currently not part of ECMAScript standards
Ясно. Кстати, неужели Mozilla не могут исправить это положение? Ведь и вправду удобно.
Сообщение от Octane
Object(object) === object
Первый раз вижу. Ну может погорячился насчет дикости. А кто-нибудь из форумчан еще использует? А в либах мож каких известных?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 28.03.2014, 18:06
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от danik.js
Ясно. Кстати, неужели Mozilla не могут исправить это положение? Ведь и вправду удобно.
Причем запись о дженериках появилась примерно год назад, всякие непонятно зачем нужные copyWithin в стандарте появляются, а действительно полезные методы нет

Сообщение от danik.js
Первый раз вижу. Ну может погорячился насчет дикости. А кто-нибудь из форумчан еще использует? А в либах мож каких известных?
Кажется я узнал о таком способе когда-то давно из здешней темы по поводу typeof null → "object". Обсуждали как этот вариант лучше пропускать. В prototype.js полно таких проверок.

Последний раз редактировалось Octane, 28.03.2014 в 18:13.
Ответить с цитированием
  #8 (permalink)  
Старый 29.03.2014, 00:20
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от Octane
всякие непонятно зачем нужные copyWithin в стандарте появляются, а действительно полезные методы нет
Лучше бы вместо него System.arraycopy из java.util.Arrays добавили
Ответить с цитированием
  #9 (permalink)  
Старый 29.03.2014, 01:18
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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.
Ответить с цитированием
  #10 (permalink)  
Старый 29.03.2014, 01:53
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от nerv_
Найди 10 отличий http://learn.javascript.ru/play/K9WRM
isObject и isPromise нашел)

Последний раз редактировалось Octane, 30.03.2014 в 01:41.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Баг Aurora promise catch Octane Оффтопик 2 28.03.2014 01:37
последовательность вызовов без promise virus-07 Общие вопросы Javascript 0 17.10.2013 10:27
работа с promise vy4eslavik AJAX и COMET 1 28.02.2013 21:55