开始学习promise了,关于自己promise模块。求助(莫名其妙正常了贴上现在的代码)今天在家里试的礼拜一去公司再看看
发布于 9 年前 作者 koroshi 5330 次浏览 最后一次编辑是 8 年前 来自 问答
Meeting.prototype.getData = function(){
    var self = this;
    return new Promise(function(resolve,reject){
        debug("getData options"+self.options);
        var req = http.request(self.options, function(res) {
            res.setEncoding('utf8');
            var resData = [];
            res.on('data', function (chunk) {
                resData.push(chunk);
            });
            res.on('end', function() {
                var data = resData.join("");
                debug("res end"+data);
                return resolve(data);
            })
        });
        req.on('error', function(e) {
            debug("problem with request:"+ e.message);
            return reject(e.message);
        });
        debug("req postData:"+ self.postData);
        req.write(self.postData);
        req.end();

    });
};

这里的reject如果reject(e),就会报错是不是就这么写还是其他写法?


下面是今天修改后的代码,总感觉没改东西

Meeting.prototype.getData = function(option){
    var self = this;
    return new Promise(function(resolve,reject){
        debug("getData options:"+self.options);
        var req = http.request(self.options, function(res) {
            res.setEncoding('utf8');
            var resData = [];
            res.on('data', function (chunk) {
                resData.push(chunk);
            });
            res.on('end', function() {
                var data = resData.join("");
                debug("res end:"+data);
                Meeting.formatMeetingDate(data).then(function(meetings){
                    var findMeetings = _.where(meetings,option);
                    findMeetings = _.map(findMeetings,function(one){
                        return  {"INFO_ID":one.INFO_ID,"BT":one.BT,"ODATE":one.ODATE,"EDATE":one.EDATE,"ROOM_NAME":one.ROOM_NAME}
                    });
                    return resolve(findMeetings);
                }).catch(function(err){
                        return reject(err)
                    });
            })
        });
        req.on('error', function(e) {
            debug("problem with request:"+ e.message);
            return reject(e);
        });
        debug("req postData:"+ self.postData);
        req.write(self.postData);
        req.end();

    });
};
15 回复

return好像要写在回调函数外面啊。我用的Q这个库是这样的

@1043099804 那应该怎么写到外面因为on是事件监听不是很会改,我原来得理解就是调用resolve表示解决 reject表示出错,这个return有没有都一样得, 我用的bluebird

我用的Q,在这个链接里面写了个例子,能简化的地方还是挺多的,不过能跑通,是个例子: https://cnodejs.org/topic/56179836ffd0f7f24fadb2f7#5618a079efc7a0bd4fb338ea

@1043099804 我觉得我这里应该也类似阿 函数直接包了一个promise然后调用resolve和reject。。。现在是我里面的reject如果接err的话不会被promise拦截,会直接程序因为错误蹦掉,我希望把那个错误给其他地方catch

说点 promise 之外的。。

推荐使用 https://github.com/request/request 这个库来发 http 请求,直接写的话代码太乱了。

req.on('error', function(e) {
        debug("problem with request:"+ e.message);
        return reject(e.message);
   });
   
   req.on('error', function(e) {
        debug("problem with request:"+ e.message);
   });
   return reject(e.message);

@koroshi 我之前这么写也会报错,你按照下面的把return放到外面试试?

这里总感觉没问题, 如果出现你说的情况, 可能是你自己的代码把错误throw出去.
我试过你的代码, 把reject(e.message)改成reject(e), 原生的Promise (iojs@ 3.2.0) 和 bluebird@ 2.10.1下都没问题.

function Meeting(options) {
  this.options = 'http://not-exists-host';
  this.postData = 'postData=querystring';
}
function debug() {
  console.log(arguments);
}

var http = require('http');
var meeting = new Meeting();
meeting.getData().then(function(result) {
  console.log('Result:')
  console.log(result);
}).catch(function(e) {
  console.log('Error Catch:');
  console.log(e);
});

下面是输出

node test.js 
{ '0': 'getData optionshttp://not-exists-host' }
{ '0': 'req postData:postData=querystring' }
{ '0': 'problem with request:getaddrinfo ENOTFOUND not-exists-host not-exists-host:80' }
Error Catch:
{ [Error: getaddrinfo ENOTFOUND not-exists-host not-exists-host:80]
  code: 'ENOTFOUND',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'not-exists-host',
  host: 'not-exists-host',
  port: 80 }


Promise.reject("Testing static reject").then(function(reason) {
  // not called
}, function(reason) {
  console.log(reason); // "Testing static reject"
});

Promise.reject(new Error("fail")).then(function(error) {
  // not called
}, function(error) {
  console.log(error); // Stacktrace
});

上面的例子是es6官方的例子,说明reject()是可以接受string/error的实例的。应该不会报错。

@hinson0 https://github.com/hinson0/n-apns/blob/master/lib/consumer.js

这个是我的一个代码

getMsg(msg) {
    let msgString = msg.data.toString('utf8');

    winston.info(`msg is ${msgString}`);

      let json = JSON.parse(msgString);

      if (typeof msg !== 'object') {
        return Promise.reject(new Error(`invalid msg ${msgString}`));
      }
      if (!json.app) {
        return Promise.reject(new Error('app is empty'));
      }
      if (!json.device_tokens) {
        return Promise.reject(new Error('device token is empty'));
      }
      return Promise.resolve(json);
  }
  

我这里刚好是用error的实例。string是肯定支持的。

小声问下,用CO不可以吗?

@alsotang 恩我看一下,感谢

@1043099804 放外面感觉拿不到这个e了今天改了一下莫名其妙好了

@William17 恩感谢今天抽空想试试莫名其妙可以了什么都没改就把所有地方的err.message改成了err好奇怪

@hinson0 恩感谢 今天试了试可以了不知道为什么

@huazhenhz 没玩过呢co

回到顶部