【问题标题】:How to properly code a promise returning function?如何正确编码承诺返回函数?
【发布时间】:2015-11-25 07:50:35
【问题描述】:

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

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 回调中没有返回任何内容。

标签: javascript promise bluebird


【解决方案1】:
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) 
  });
});

【讨论】:

    【解决方案2】:

    您应该使用new Promise 而不是 Promise.method。这是因为从事件处理程序中抛出或返回没有被 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);
        });
    

    【讨论】:

    • 那么,Promise.method 有什么区别?
    • @diegoaguilar:是verydifferent
    • @Bergi 你能解释一下区别吗?
    • @diegoaguilar:Promise 构造函数采用带有回调的异步函数,并返回一个承诺。 Promise.method 函数包装了一个同步函数,并返回一个函数。他们的签名和目的完全不同,我什至无法比较。
    • 所以,为了恢复,Promise 构造函数可以用来代替 Promise.method,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2018-07-27
    • 2020-08-09
    • 2023-03-04
    • 2017-04-05
    • 2020-05-23
    相关资源
    最近更新 更多