响应在结果可以从承诺中收集之前终止

在下面的代码片段中, lineReader监听一个事件line 。 当收到一个line事件时,它会在Parser上调用da ,并返回一个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.getLocationreadLine.on('close')被调用的输出。

应该怎样处理这种情况呢?

你没有解决诺言。 从地理服务获得结果时,您需要parsing数据。

看看这个

 Parser.da = function(line) { return new Promise((resolve,reject) => { geo.getLocation().then((r) => { console.log(r); resolve(r); }); }); } 

为什么不只是从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是asynchronous的,所以lineReader.on(“line”); 在承诺可以被执行之前事件被closures,因为事件是同步的。 然后lineReader.on(“close”); 在承诺解决之前执行。

你也应该在你的承诺中总是有一个“catch”,这样你就可以看到是否有任何错误。 喜欢这个:

 lineReader.on('line',(line) => { Parser.da(line).then((info) => { // ...do code here }, console.error); // errors will be outputted to console });