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);
Мне любопытно, есть ли какой-либо недостаток дизайна в этом решении, например, замедление производительности или некорректность.
Ответы
Ответ 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, имеет тенденцию тестировать задержку".