javascript - ब्लूबर्ड के साथ खारिज किए गए वादों में संसाधनों का निपटान कैसे करें?



node.js serial-port (1)

इस सवाल से ही जवाब मिलता है, "वादा" और "निपटान" में आप एकसाथ वादा करता है कि वादा डिस्पोजेर पैटर्न पर विचार करें, जो कि वास्तव में किसी भी तरह का उचित उपयोग नहीं है। तब .then() या। .finally() एक कॉलबैक के साथ जो बंद करता है / बंद करता है जो कुछ बनाया / पहले खोल दिया था

उस पैटर्न को ध्यान में रखते हुए, आपको pingPort() बजाय findPort() से findPort() लिए इसे सरल बनाना होगा।

प्रश्न में कोड को मोटे तौर पर सही मानते हुए, आप finally() चेन 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".
    });
};

इसके विपरीत, तब।, अंत में, हैंडलर मूल्य / कारण को संशोधित नहीं करता है, इसलिए किसी मूल्य को वापस लाने या त्रुटि को पुनर्स्थापित करने के बारे में चिंता किए बिना मध्य श्रृंखला में रखा जा सकता है। इस बिंदु को नीलेबर्ड प्रलेखन में खराब रूप से बनाया गया है।

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() द्वारा दिए गए वादों की सरणी के साथ और कुछ करना चाहते हैं, लेकिन यह एक और मुद्दा है

जब वादा अस्वीकार कर दिया जाता है तो मैं कैसे सीरियल का निपटान कर सकता हूं?

अस्वीकृति कार्य अस्वीकृत वादे के लिए त्रुटि प्रिंट करता है।

अप्रतिबंधित अस्वीकृति प्रकार त्रुटि: अपरिभाषित की विधि '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);
}();





bluebird