0

我对节点非常陌生,并且在按顺序运行某些函数和使用回调时遇到了问题。我曾尝试使用异步模块,但是,我认为我遗漏了一些东西,因为它使我的功能无序。

用最简单的术语来说,我想以 url 参数的形式检索一些数据,然后:1. 将它们写入文件 2. lpr 打印它们 3. 删除文件

我当前的代码在打印之前删除了文件。即在第 2 步之前的第 3 步。有人会就如何最好地按顺序执行这些操作提供一些建议吗?提前致谢。

router.get('/zplprint/:barcode/:zpl', function(req, res) {
var zpl = req.params.zpl;
var filename  = appDir + "/uploads/" + req.params.barcode + ".zpl";
console.log(req.params.zpl);
res.send("received zpl: " + req.params.zpl);

async.series([
    function(callback){
        fs.writeFile(filename, zpl, function(err) {
        if(err) {
            callback(err);
            return;
        }
        console.log("The file was saved! to "+filename);
            callback();
        });
    },
    function(callback){
        CupsPrinterName = nconf.get('Print:PrinterName');
        console.log(CupsPrinterName);
        var cmd = 'lpr -P ' + CupsPrinterName + ' -o raw ' + filename;
        exec(cmd, function(error, stdout, stderr) {
            // command output is in stdout'
            console.log(cmd);
            console.log("file printed");
        });
        callback();
    },
    function(callback){
        fs.unlink(filename, function (err) {
            console.log('   deleting ' + filename);

        });
        callback();
    }
]);

});

4

2 回答 2

0

callback()在同一级别调用函数exec(), exec 是异步的,并且会在删除文件后记录“文件打印”,因为 callback() 是在外部调用的,exec()而不是在函数结束时调用的。打印后尝试调用回调:

function(callback){
    CupsPrinterName = nconf.get('Print:PrinterName');
    console.log(CupsPrinterName);
    var cmd = 'lpr -P ' + CupsPrinterName + ' -o raw ' + filename;
    exec(cmd, function(error, stdout, stderr) {
        // command output is in stdout'
        console.log(cmd);
        console.log("file printed");
        callback();
    });        
},
于 2015-11-05T15:29:52.897 回答
0
var Q = require('q')


router.get('/zplprint/:barcode/:zpl', function(req, res) {
var zpl = req.params.zpl;
var filename  = appDir + "/uploads/" + req.params.barcode + ".zpl";
console.log(req.params.zpl);
res.send("received zpl: " + req.params.zpl);


    function first(callback){
        var d1 = Q.defer();
        fs.writeFile(filename, zpl, function(err) {
            if(err) {
                d1.reject(err);

            }
            console.log("The file was saved! to "+filename);
            d1.resolve("success");
        });
        return d1.promise
    }



    function second(callback){
        var d2  = Q.defer()
        CupsPrinterName = nconf.get('Print:PrinterName');
        console.log(CupsPrinterName);
        var cmd = 'lpr -P ' + CupsPrinterName + ' -o raw ' + filename;
        exec(cmd, function(error, stdout, stderr) {
           if(error){
               d2.reject()
           }
            console.log(cmd);
            console.log("file printed");
            d2.resolve()
        });
        return d2.promise
    }



    function third(callback){
        var d3 = Q.defer()
        fs.unlink(filename, function (err) {
            if(err){
                d3.reject()
            }
            console.log('   deleting ' + filename);
                d3.resolve()
        });
        return d3.promise
    }

  first().then(second).then(third).fail(function(){
    console.log("Error !!!!")


})

});

先决条件:

npm install q 

有史以来最好的承诺结构

于 2015-11-06T06:17:21.330 回答