Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript Promise/Defer in Chrome

I use the Q library that supports the Promise specification well. But I also try to use the Promise class that has been implemented in Chrome not long ago (experimentally).

There's the defer function in Q that can be used for creating a non-fulfilled promise that can be resolved or rejected in the future.

I've implemented the same functionality using the native Promise presented in Chrome. Here's an example:

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);

I'm curious is there any design flaw in this solution such as performance slowdown or incorrectness.

like image 968
shadeglare Avatar asked Feb 08 '14 23:02

shadeglare


2 Answers

You are creating unnecessary function objects.

You can just do:

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

Design flaw is doing this in the first place, native promises are useless if you are using Q.

like image 190
Esailija Avatar answered Sep 26 '22 02:09

Esailija


See http://bluebirdjs.com/docs/benchmarks.html for benchmarks. There are some JSPerf benchmarks as well, however "for a reasonably fast promise implementations latency is going to be fully determined by the scheduler being used and is therefore not interesting to benchmark. JSPerfs that benchmark promises tend to benchmark latency."

like image 36
lammy Avatar answered Sep 23 '22 02:09

lammy