Подтвердить что ты не робот

JavaScript Promise/Defer в Chrome

Я использую библиотеку Q, которая хорошо поддерживает спецификацию Promise. Но я также пытаюсь использовать класс Promise, который был недавно реализован в Chrome (экспериментально).

Существует функция отсрочки в Q, которая может быть использована для создания невыполненного обещания, которое может быть разрешено или отклонено в будущем.

Я реализовал ту же функциональность, используя собственную Promise, представленную в Chrome. Вот пример:

var defer = function() {
    var result = {};
    result.promise = new Promise(function(resolve, reject) {
        result.resolve = function(value) {
            resolve(value);
        };
        result.reject = function(value) {
            reject(value);
        };
    });
    return result;
};

var deferred = defer();
deferred.promise.then(function(value) {
    alert(value);
});
deferred.resolve(10);

Мне любопытно, есть ли какой-либо недостаток дизайна в этом решении, например, замедление производительности или некорректность.

4b9b3361

Ответ 1

Вы создаете ненужные объекты функции.

Вы можете просто сделать:

var defer = function() {
    var result = {};
    result.promise = new Promise(function(resolve, reject) {
        result.resolve = resolve;
        result.reject = reject;
    });
    return result;
};

Ошибка дизайна делает это, в первую очередь, native promises бесполезны, если вы используете Q.

Ответ 2

См. http://bluebirdjs.com/docs/benchmarks.html для тестов. Также есть некоторые тесты JSPerf, однако "для достаточно быстрой перспективы реализации реализация будет полностью определяться используемым планировщиком и поэтому не интересна для сравнения. JSPerfs, ориентированный на promises, имеет тенденцию тестировать задержку".