响应在结果可以从承诺中收集之前终止
在下面的代码片段中, 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.getLocation
和readLine.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 });