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

开始学习promise了,关于自己promise模块。求助(莫名其妙正常了贴上现在的代码)今天在家里试的礼拜一去公司再看看
发布于 10 年前 作者 koroshi 5799 次浏览 最后一次编辑是 9 年前 来自 问答
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

回到顶部

AltStyle によって変換されたページ (->オリジナル) /