如何用蓝鸟处理被拒绝的承诺中的资源?
How to dispose resources in rejected promises with bluebird?
promise被拒绝后如何处理serial?
dispose 函数打印拒绝承诺的错误。
Unhandled rejection TypeError: Cannot call method 'isOpen' of
undefined
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" 和 "dispose" 一起恳求您考虑 ,这实际上只不过是明智地使用 .then()
或 .finally()
回调 disposes/closes 之前 created/opened 的东西。
考虑到该模式,您会发现在 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 的处理程序不修改 value/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()
返回的承诺数组执行更多操作,但这是另一个问题。
promise被拒绝后如何处理serial?
dispose 函数打印拒绝承诺的错误。
Unhandled rejection TypeError: Cannot call method 'isOpen' of undefined
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" 和 "dispose" 一起恳求您考虑 .then()
或 .finally()
回调 disposes/closes 之前 created/opened 的东西。
考虑到该模式,您会发现在 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 的处理程序不修改 value/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()
返回的承诺数组执行更多操作,但这是另一个问题。