1

I'm trying to code functions following the promise return pattern, this is a generic example of what I'm trying:

var Promise = require('bluebird');
var request = require('request');

var returnPromise = Promise.method(function () {
    request
      .get('http://google.com/img.png')
      .on('response', function(response) {
            if (response.statusCode !== 200)
                throw new Error('Bad request');

            else
                return response.headers;
      })    
});

returnPromise()
    .then(function (headers) {
        console.log(headers);
    })
    .catch(function (err) {
        console.log('Error handling);
    });

However this is not working properly as the error is yet being thrown and not handled. How should this be implemented?

diegoaguilar
  • 8,179
  • 14
  • 80
  • 129

2 Answers2

2
var Promise = require('bluebird');
var request = require('request');

var returnPromise = function () {
  return new Promise(function(resolve, reject){
    request
      .get('http://google.com/img.png')
      .on('response', resolve)
      .on('error', reject) 
  });
});
1

You should use new Promise instead of Promise.method. This is because throwing or returning from event handlers isn't captured by the promise.

var Promise = require('bluebird');
var request = require('request');

var returnPromise = function () {
  return new Promise(function(resolve, reject){
    request
      .get('http://google.com/img.png')
      .on('response', function(response) {
            if (response.statusCode !== 200)
                reject(Error('Bad request'));

            else
                resolve(response.headers);
      })    
  });
});

returnPromise()
    .then(function (headers) {
        console.log(headers);
    })
    .catch(function (err) {
        console.log('Error handling);
    });
Brigand
  • 84,529
  • 20
  • 165
  • 173
  • So, what's difference with `Promise.method`? – diegoaguilar Nov 24 '15 at 23:17
  • @diegoaguilar: It's [very](http://stackoverflow.com/a/32310205/1048572) [different](http://stackoverflow.com/a/32160991/1048572) – Bergi Nov 24 '15 at 23:59
  • @Bergi could you explain difference? – diegoaguilar Nov 25 '15 at 00:09
  • @diegoaguilar: The `Promise` constructor takes an asynchronous function with callbacks, and returns a promise. The `Promise.method` function wraps a synchronous function, and returns a function. Their signatures and purposes are completely different, I cannot even compare them. – Bergi Nov 25 '15 at 00:11
  • So, just to resume, `Promise` constructor could be used instead of Promise.method, right? – diegoaguilar Nov 25 '15 at 00:14