CNode

开始学习promise了,关于自己promise模块。求助(莫名其妙正常了贴上现在的代码)今天在家里试的礼拜一去公司再看看

问答
Kkoroshi发布于11 年前最后回复11 年前15 回复5991 浏览0 收藏
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)

1
1043099804#1·11 年前

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

K
koroshi#2·11 年前
引用 1043099804return好像要写在回调函数外面啊。我用的Q这个库是这样的

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

1
1043099804#3·11 年前

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

K
koroshi#4·11 年前
引用 1043099804我用的Q,在这个链接里面写了个例子,能简化的地方还是挺多的,不过能跑通,是个例子: https://cnodejs.org/topic/56179836ffd0f7f24fadb2f7 561...

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

A
alsotang#5·11 年前

说点 promise 之外的。。

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

1
1043099804#6·11 年前
引用 koroshi@1043099804 我觉得我这里应该也类似阿 函数直接包了一个promise然后调用resolve和reject。。。现在是我里面的reject如果接err的话不会被promise拦截,会...
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放到外面试试?

W
William17#7·11 年前

这里总感觉没问题, 如果出现你说的情况, 可能是你自己的代码把错误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 }


H
hinson0#8·11 年前
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的实例的。应该不会报错。

H
hinson0#9·11 年前
引用 hinson0上面的例子是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是肯定支持的。

H
huazhenhz#10·11 年前

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

K
koroshi#12·11 年前
引用 1043099804req.on('error', function(e) { debug("problem with request:"+ e.message); return reject(e.message...

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

K
koroshi#13·11 年前
引用 William17这里总感觉没问题, 如果出现你说的情况, 可能是你自己的代码把错误throw出去. 我试过你的代码, 把reject(e.message)改成reject(e), 原生的Promise (io...

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

K
koroshi#15·11 年前
引用 huazhenhz小声问下,用CO不可以吗?

@huazhenhz 没玩过呢co

参与回复
登录后即可参与回复。登录