Javascript 如何正确编码承诺返回函数?

Javascript 如何正确编码承诺返回函数?,javascript,promise,bluebird,Javascript,Promise,Bluebird,我尝试按照承诺返回模式编写函数,这是我尝试的一个通用示例: var Promise = require('bluebird'); var request = require('request'); var returnPromise = Promise.method(function () { request .get('http://google.com/img.png') .on('response', function(response) {

我尝试按照承诺返回模式编写函数,这是我尝试的一个通用示例:

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

但是,这无法正常工作,因为错误仍在抛出且未得到处理。这应该如何实现?

您应该使用
新承诺
而不是Promise.method。这是因为事件处理程序的抛出或返回不被承诺捕获

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

您在
Promise.method
回调中不返回任何内容。那么,
Promise.method
与@diegoaguilar有什么区别?@diegoaguilar:It's@Bergi您能解释区别吗?@diegoaguilar:The
Promise
构造函数使用带有回调的异步函数,并返回一个承诺。
Promise.method
函数包装一个同步函数,并返回一个函数。它们的签名和用途完全不同,我甚至无法比较它们。所以,继续说,
Promise
constructor可以用来代替Promise.method,对吗?
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) 
  });
});