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

Octane 30.03.2014 05:17

Короче магическим образом заставил IE8 работать: переименовал параметры функции и параметр в try-catch, так чтобы они не совпадали. Повторить баг не получилось, но reason не понятно когда становился undefined :D
function (reason) {

	…

	try {

		…

	}
	catch (*!*reason*/!*) {

		…

	}

	…
 
}


вторая причина тут http://javascript.ru/forum/misc/4588...-funkcijj.html

nerv_ 01.04.2014 00:58

Накопилось много вопросов. Мужайся :)

1. Закончен ли полифил? (ие8 меня не интересует)
2. Покрыт ли он тестами?
3. Будет ли выложен на гитхаб?
4. Планируется ли адаптация (setImmediate -> nextTick, ...) под node.js?

Octane 01.04.2014 01:44

Цитата:

Сообщение от nerv_
1. Закончен ли полифил? (ие8 меня не интересует)

Кроме метода cast и thenable value, остальное реализовано, поведение как в Aurora 29 и Chrome 35 (resolver синхронный, resolve и reject асинхронные). Метода cast нет ни в Aurora, ни в Chrome, а последний еще и не умеет промисы делать из объектов с методом then, так что не знаю, стоит ли пытаться дополнять нативную реализацию?

Цитата:

Сообщение от nerv_
2. Покрыт ли он тестами?

я слишком ленивый :( надо будет с чужого полифила тесты забрать)

Цитата:

Сообщение от nerv_
3. Будет ли выложен на гитхаб?

https://github.com/Octane/jsCore/blo...ill/promise.js

Цитата:

Сообщение от nerv_
4. Планируется ли адаптация (setImmediate -> nextTick, ...) под node.js?

достаточно:
var setImmediate = process.nextTick;

ну и там всякие Object.assign и Array generic methods


npm установщик никогда не делал, надо будет разбираться



--------------------------------
хм
Цитата:

Promise.cast is renamed to Promise.resolve
https://mail.mozilla.org/pipermail/e...ry/036194.html

а тут http://esdiscuss.org/topic/promise-c...romise-resolve вроде спорят, что это разные методы были


------------------
чорт баг нашел: resolver только один раз может выполнится, то есть реюз обещания не возможен, но при этом then'ы все должны выполнятся, даже если promise уже settled

kobezzza 01.04.2014 09:13

Цитата:

Планируется ли адаптация (setImmediate -> nextTick, ...) под node.js?
Дык в ноде из коробки setImmediate есть же уже давно.
А ваще: https://github.com/NobleJS/setImmediate

Octane 01.04.2014 09:52

О точно есть, забыл, что в node-webkit его из global надо вытаскивать, когда проверял

Octane 02.04.2014 02:59

Короче у меня уже promise мозга :D

Чтобы сделать обещания одноразовыми, почти все заново переписал…

nerv_ 03.04.2014 14:52

Цитата:

Сообщение от Octane
Короче у меня уже promise мозга

А ты как думал, лезть в обещания :)

nerv_ 08.05.2014 14:51

Octane, сейчас пытаюсь установить твой promise-polyfill и понимаю, что это не так просто сделать :)

Ситуация такая: я использую es5-shim, т.е. es5 у меня можно сказать есть. Для того, чтобы твой полифил запустился, мне необходимо еще установить:
Object.assign
Array.slice
Array.forEach
Array.every
window.setImmediate

Можно это дело отразить хотя бы в комментариях к полифилу? А то получается, каждый разработчик, кот. захочет воспользоваться твоим promise-полифилом, обязан прочитать код и проверить его на наличие es6 фич в том случае, если он не использует все твои полифилы.
И идеале, было бы хорошо ссылок набросать на required для es3 и es5 для данного полифила.

Лично я бы выкинул из реализации Object.assign, т.к. без него можно обойтись.
Иными словами, ты заставляешь меня тянуть Object.assign :)
А также
Array.slice
Array.forEach
Array.every

несмотря на то, что es5 у меня есть.

Octane 08.05.2014 15:14

Как?! как можно жить без Object.assign?! :D Да, вечером оформлю.
Пока что вот ссылки на гитхаб:

Object.assign
//using Object.keys: goo.gl/0QNMDz
//several sources: twitter.com/rwaldron/status/454114058640183296
//people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign
if (!Object.assign) {
    Object.assign = function (target) {
        Array.prototype.slice.call(arguments, 1).forEach(function (source) {
            Object.keys(source).forEach(function (key) {
                target[key] = source[key];
            });
        });
        return target;
    };
}

Array generics
//Array generic methods
new function () {

    function fastApply(method, args) {
        var target = args[0];
        switch (args.length) {
            case 1:
                return method.call(target);
            case 2:
                return method.call(target, args[1]);
            case 3:
                return method.call(target, args[1], args[2]);
        }
        return method.apply(target, Array.prototype.slice.call(args, 1));
    }

    function createGeneric(method) {
        return function () {
            return fastApply(method, arguments);
        };
    }

    function createGenerics(source, names) {
        return names.reduce(function (methods, name) {
            methods[name] = createGeneric(source[name]);
            return methods;
        }, {});
    }

    function implement(object, methods) {
        Object.keys(methods).forEach(function (name) {
            if (!(name in object)) {
                object[name] = methods[name];
            }
        });
    }

    implement(Array, createGenerics(Array.prototype, [
        'concat', 'every', 'fill', 'filter', 'find',
        'findIndex', 'forEach', 'indexOf', 'join',
        'lastIndexOf', 'map', 'pop', 'push', 'reduce',
        'reduceRight', 'reverse', 'shift', 'slice',
        'some', 'sort', 'splice', 'unshift'
    ]));

};

setImmediate IE9+
window.setImmediate || Object.assign(window, window.msSetImmediate ? {

    //IE10
    setImmediate: window.msSetImmediate,
    clearImmediate: window.msClearImmediate

} : new function () {

    var id = 0,
        storage = {},
        firstCall = true,
        message = 'setImmediatePolyfillMessage';

    function fastApply(args) {
        var func = args[0];
        switch (args.length) {
            case 1:
                return func();
            case 2:
                return func(args[1]);
            case 3:
                return func(args[1], args[2]);
        }
        return func.apply(window, Array.prototype.slice.call(args, 1));
    }

    function callback(event) {
        var data,
            key = event.data;
        if ('string' == typeof key && key.startsWith(message)) {
            data = storage[key];
            if (data) {
                fastApply(data);
                delete storage[key];
            }
        }
    }

    return {

        setImmediate: function () {
            var key = message + ++id;
            storage[key] = arguments;
            if (firstCall) {
                firstCall = false;
                window.addEventListener('message', callback);
            }
            window.postMessage(key, '*');
            return id;
        },

        clearImmediate: function (id) {
            delete storage[message + id];
        }

    };

});


сам Promise polyfill
правда я там в последней версии дописал window. перед setImmediate, потому что 'setImmediate' in Window.prototype → true, не знаю, может зря так сделал, если кто в Nodejs захочет подключить, работать не будет, хотя для ноды и так миллион полифилов есть… сделать через global?

----------
Наверное отдельный самодостаточный репозиторий на гитхабе сделаю

nerv_ 08.05.2014 15:37

Я еще немного покритиХую :)

---

На мой взгляд, ты заставляешь тянуть es6 код в проект. Не каждому проекту он нужен. Поэтому, как мне кажется, логичным было бы сделать возможность его не тянуть. Например, в виде версий для es5 и es6.

По поводу ноды - я за универсальность (по возможности). Допустим, есть миллион полифилов, но я работаю с твоим на клиенте. Я уже знаю, что он фуричит, проверен. Почему бы не использовать его и на сервере?


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