Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is 'new Promise(...)' returning 'undefined'?

It seems that if the 'resolve' function is not referenced in the function that is used to create a promise, then the promise is undefined. In the code below, ...

var count = 0;
var limit = 3;
//
var thePromise;
function timeout(_count) {
    thePromise.resolve(_count);
}
function sendMessage() {
    return new Promise(function(resolve, reject) {
        if (++count > limit) {
            reject({'Limit Exceeded': count});
        }
        else {
// With this line in place, the return value from this function
// (expected to be a promise) is undefined
            setTimeout(timeout.bind(null, count), 1000);
// If the line above is replaced by this, it works as expected
//            setTimeout(/*timeout.bind(null, count)*/function (_count) {
//                resolve(_count);
//            }.bind(null, count), 1000);
        }
    });
}

function sendAnother(_count) {
    console.log('Resolved with count %j', _count);
    return sendMessage();
}
function detectError(_error) {
    console.log('Rejected with %s', JSON.stringify(_error));
    process.exit(1);
}
thePromise = sendMessage();
thePromise = thePromise.then(function (_count) { return sendAnother(_count)}, function(_error) {detectError(_error)});

trying to do the resolve outside of the function that creates the promise, results in:

node-promises.js:6
    thePromise.resolve(_count);
               ^
TypeError: undefined is not a function
    at timeout (node-promises.js:6:16)
    at Timer.listOnTimeout (timers.js:110:15)

But if line 16 is commented out and lines 18-20 are uncommented, the output is:

Resolved with count 1

.. which is what I expected. What am I missing? This is using nodejs v0.12.2 on Windows 7, if that makes any difference.

like image 867
Peter Faller Avatar asked Aug 18 '15 06:08

Peter Faller


1 Answers

It happens because of this line:

thePromise.resolve(_count);

there is no resolve function on that object. resolve comes from the function you have created when instantiating the new promise:

return new Promise(function(resolve, reject) {

By commenting out that line, and using the alternate function, you are calling the correct resolve(), which causes the desired output. One option to fix this could be to pass the resolve function into your timeout call, eg:

function timeout(resolve, _count) {
    resolve(_count);
}

Although I am not sure why you would want to do this.


Your title asks why new Promise is returning undefined, when the fact is that it isn't. It is indeed returning a valid promise. It is just that resolve is not a valid function on the promise object.

like image 184
Matt Way Avatar answered Sep 26 '22 02:09

Matt Way