Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Promise polyfill (https://javascript.ru/forum/project/46096-promise-polyfill.html)

Octane 28.03.2014 05:03

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

danik.js 28.03.2014 09:56

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

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


Кстати, может кто пояснить, в каком стандарте писаны методы Array.slice и прочие?

monolithed 28.03.2014 10:35

Цитата:

Сообщение от Octane
В IE8 почему-то не работает

Может по тому что мало тестов? :)

nerv_ 28.03.2014 13:11

Добавлю ссылок:
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, пошел отсюда далеко и надолго :)

Octane 28.03.2014 16:47

Цитата:

Сообщение от 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 и реализован почти так же, как в той теме

danik.js 28.03.2014 17:41

Цитата:

Сообщение от Octane
Array generic methods

Цитата:

These are currently not part of ECMAScript standards
Ясно. Кстати, неужели Mozilla не могут исправить это положение? Ведь и вправду удобно.
Цитата:

Сообщение от Octane
Object(object) === object

Первый раз вижу. Ну может погорячился насчет дикости. А кто-нибудь из форумчан еще использует? А в либах мож каких известных?

Octane 28.03.2014 18:06

Цитата:

Сообщение от danik.js
Ясно. Кстати, неужели Mozilla не могут исправить это положение? Ведь и вправду удобно.

Причем запись о дженериках появилась примерно год назад, всякие непонятно зачем нужные copyWithin в стандарте появляются, а действительно полезные методы нет :(

Цитата:

Сообщение от danik.js
Первый раз вижу. Ну может погорячился насчет дикости. А кто-нибудь из форумчан еще использует? А в либах мож каких известных?

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

monolithed 29.03.2014 00:20

Цитата:

Сообщение от Octane
всякие непонятно зачем нужные copyWithin в стандарте появляются, а действительно полезные методы нет

Лучше бы вместо него System.arraycopy из java.util.Arrays добавили :)

nerv_ 29.03.2014 01:18

Цитата:

Сообщение от Octane
Здесь не просто this.constructor, потому что в strict режиме this может быть undefined.

я про это ничего не говорил. Найди 10 отличий http://learn.javascript.ru/play/K9WRM :)

Цитата:

Сообщение от Octane
setImmediate есть в polyfills.js, используется в Promise и реализован почти так же, как в той теме

да, я обратил внимание, что хаки для его реализации можно пересчитать, использую пальцы одной руки

Octane 29.03.2014 01:53

Цитата:

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

isObject и isPromise нашел)


Часовой пояс GMT +3, время: 15:25.