在以下代码段中,lineReader
会收听事件line
。收到line
事件后,会在da
上调用Parser
,并返回Promise
lineReader.on('line',(line) => {
Parser.da(line).then((info) => {
});
});
lineReader.on('close',() => {
req.end();
});
Parser.da = function(line) {
return new Promise((resolve,reject) => {
geo.getLocation().then((r) => {
console.log(r); return resolve(r);
});
});
}
da
函数返回调用一个也在Promise
上运行的函数。会发生什么事情,我永远不会看到来自geo.getLocation
和readLine.on('close')
的输出被调用。
处理这种情况的方法应该是什么?
答案 0 :(得分:1)
你没有解决这个承诺。从地理服务获得结果时,您需要解析数据。
看看这个
Parser.da = function(line) {
return new Promise((resolve,reject) => {
geo.getLocation().then((r) => {
console.log(r);
resolve(r);
});
});
}
答案 1 :(得分:0)
为什么不直接从geo.geoLocation()返回Promise而不是将其包装到另一个promise中?像这样:
Parser.da = function(line) {
return geo.geoLocation();
}
或者您可能希望链接"然后"而是。虽然这是同步的
Parser.da = function(line) {
return geo.geoLocation().then(function (r) {
console.log(r);
return r; // return r to chain it to the next ".then"
});
}
一个可能的问题可能是promise是异步的,所以lineReader.on(" line");事件在执行promise之前关闭,因为事件是同步的。然后是lineReader.on(" close");在承诺解决之前执行。
此外,你应该总是有一个" catch"在你的承诺中,你可以看到是否有任何错误。像这样:
lineReader.on('line',(line) => {
Parser.da(line).then((info) => {
// ...do code here
}, console.error); // errors will be outputted to console
});