2017-03-20 42 views
2

在以下片段中,lineReader收聽事件line。當接收到一個line的事件,它調用Parserda返回的回報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')的輸出被調用。

應該怎樣處理這種情況?

+0

避免['Promise'構造反模式](http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to -躲開它)! (這不應該阻止你的日誌) – Bergi

+0

也許'getLocation'承諾被拒絕?你不會在任何地方處理錯誤。 – Bergi

+0

無論你做什麼,close事件都會被解僱,readline流並不關心(並等待)你在'line'處理器中做了什麼 – Bergi

回答

1

你沒有解決承諾。當您從地理服務獲得結果時,您需要解析數據。

看看這個

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

它正在被解析,但流程永遠不會到達那裏。請參閱編輯。 –

+0

我剛看到你的編輯。順便說一句,你不需要返回它,只需解決它。 –

+0

不工作。 'geo.getLocation'是一個異步函數 –

0

爲什麼你不只是返回從geo.geoLocation無極(),而不是包成另一個承諾嗎?像這樣:

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

一個可能的問題可能是一個承諾是異步的,因此lineReader.on(「線」);由於事件是同步的,因此在執行承諾前關閉事件。然後lineReader.on(「close」);在承諾解決之前執行。

此外,您應該始終在承諾中有一個「catch」,以便您可以查看是否有任何錯誤。就像這樣:

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