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