如何使用bluebird处理被拒绝的承诺中的资源
How to dispose resources in rejected promises with bluebird?
当承诺被拒绝时,我如何处置该串行?
dispose函数打印被拒绝承诺的错误。
未处理的拒绝类型错误:不能调用方法'isOpen'的未定义的
var pingPort = function(port){
return new promise(function(resolve, reject){
var serial = new com.SerialPort(port.comName, {
baudrate: 19200,
parser: com.parsers.readline(lineEnd)
}, false);
serial.on("data", function(data){
if (data === responseUuid){
resolve(serial);
}
});
serial.open(function(err){
if (err){
//reject(serial)
}
else{
serial.write(pingUuid + lineEnd);
}
});
});
};
var dispose = function(port){
console.log(port.isOpen());
};
var findPort = function(){
com.listAsync().map(function(port){
return pingPort(port).timeout(100).catch(promise.TimeoutError, function(err) {
console.log("Ping timout: " + port.comName);
dispose(port);
}).catch(function(err){
console.log("Ping error: " + port.comName);
dispose(port);
});
}).each(dispose);
}();
这个问题几乎可以自己回答,因为"promise"answers"dispose"一起请求您考虑promise dispose模式,这实际上只不过是明智地使用.then()
或.finally()
,并使用一个回调来处置/关闭先前创建/打开的东西。
记住这个模式,您会发现在pingPort()
中编排处置比在findPort()
中更简单。
假设问题中的代码大致正确,您可以将finally()
链接如下:
var pingPort = function(port) {
var serial; // outer var, necessary to make `serial` available to .finally().
return new promise(function(resolve, reject) {
serial = new com.SerialPort(port.comName, {
baudrate: 19200,
parser: com.parsers.readline(lineEnd)
}, false);
serial.on('data', function(data) {
if(data === responseUuid) {
resolve(serial); //or resolve(port);
}
});
serial.open(function(err) {
if(err) {
reject('failed to open');
} else {
serial.write(pingUuid + lineEnd);
}
});
})
.finally(function() { // <<<<<<<<<<<
serial.close(); // "dispose".
});
};
与。then不同,.finally的处理程序不修改值/reason,因此可以放置在中间链中,而无需担心返回值或重新抛出错误。这一点在Bluebird文档中做得相当糟糕。
在pingPort()
中进行处理,findPort()
将简化如下:
var findPort = function(){
com.listAsync().map(function(port) {
return pingPort(port).timeout(100)
.catch(promise.TimeoutError, function(err) {
console.log("Ping timout: " + port.comName);
})
.catch(function(err){
console.log("Ping error: " + port.comName);
});
});
}();
更进一步,您可能希望对.map()
返回的承诺数组做更多的操作,但这是另一个问题。
相关文章:
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 从函数返回角度承诺
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 否'访问控制允许来源'标头存在于IISNOde中请求的资源(AngularJS+NodeJs)上
- WebResources嵌入式资源和Javascript如何在另一个嵌入式资源中使用它们
- 在承诺链中处理早期回报的最佳方式
- 如何在构建node-webkit应用程序后获取外部资源
- ADF:有条件地加载javascript资源
- Javascript嵌入式图像资源
- angular:有承诺的集中资源工厂
- 对AngularJS资源保存动作的承诺
- 如何使用bluebird处理被拒绝的承诺中的资源
- 如何在复杂的资源加载序列中正确链化承诺
- Angular资源保存承诺
- 我如何使用资源对象(通过承诺)与D3
- Angular'的资源承诺在加载数据时不会重新渲染
- 成功回调资源类操作,还是资源承诺,哪一个是第一个
- 在 AngularJS 中使用承诺的多个资源调用