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

Octane 10.05.2014 17:19

Цитата:

Сообщение от monolithed
setImmediate = (global.window || global).setImmediate
Почему не написать посто global.setImmediate?

для node-webkit изворачивался, убрал


Цитата:

Сообщение от monolithed
А что у тебя с версионностью?

Я не делал npm publish, думал он, как bower, сам будет устанавливать последнюю версию. Обновил.

Maxmaxmaximus100 10.05.2014 19:59

а можно я на кофискрипт напишу)? а то тим меня на него подсадил я теперь ни че другого и видеть не хочу)

Octane 10.05.2014 19:59

не отмазывайся теперь ;)

Maxmaxmaximus100 10.05.2014 20:17

ну хорошо не в 50 строк кода а в 100 примерно) но логика то простая там

Octane 11.05.2014 01:32

Добавил поддержку thenable
var thenable = {
    then: function (onFulfilled) {
        onFulfilled(5);
    }
};


Promise.resolve(thenable).then(function (value) {
    console.log(value); //5
});


Promise.resolve().then(function () {
    return thenable;
}).then(function (value) {
    console.log(value); //5
});


Promise.race([thenable]).then(function (value) {
    console.log(value); //5
});


Promise.all([thenable]).then(function (values) {
    console.log(values[0]); //5
});


promise.then(thenable) выбросит исключение наружу, как в Chrome, Aurora игнорирует.

thenable.then всегда запускается асинхронно, как в Chrome (в Aurora синхронно), обсуждение бага:
https://github.com/getify/native-promise-only/issues/5
https://github.com/domenic/promises-...ing/issues/105

Octane 01.01.2015 18:59

Теперь полифил проходит все 872 теста из Promises/A+ Compliance Test Suite
+ еще несколько тестов для Promise.all и Promise.race

Чтобы сжать с помощью Closure Compiler в режиме Advanced, в экстерны надо добавить exports.

trikadin 20.01.2015 01:24

А всем нравится, что resolve/reject передаются как параметры в функцию?

Octane 20.01.2015 04:24

Можно наружу вытащить, если Deferred привычнее
function doSomething() {
    
    var deferred = {};
    deferred.promise = new Promise(function (resolve, reject) {
        deferred.resolve = resolve;
        deferred.reject = reject;
    });
    
    window.setTimeout(function () {
        deferred.resolve('value');
    }, 100500);

    return deferred.promise;
}

nerv_ 20.01.2015 11:51

Цитата:

Сообщение от Octane
Можно наружу вытащить, если Deferred привычнее

совершенно верно. Я просто в класс Deferred завернул :) Примерно так

function Deferred() {
    this.promise = new Promise(function(resolve, reject) {
        this.resolve = resolve;
        this.reject = reject
    }.bind(this));
}

Deferred.prototype.resolve = function() {};
Deferred.prototype.reject = function() {};

// --------------

var deferred = new Deferred();

setTimeout(function() {
    deferred.resolve(1);
}, 1000);

deferred.promise.then(function(response) {
    alert(response);
});

trikadin 20.01.2015 15:37

Octane, взял на заметку. Deferred действительно привычнее.

melky 20.01.2015 22:06

Цитата:

Сообщение от trikadin (Сообщение 352296)
А всем нравится, что resolve/reject передаются как параметры в функцию?

чистоганом редко использую Promise, но когда приходится - не колышат эти аргументы


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