【问题标题】:sequentially run functions in nodejs在nodejs中顺序运行函数
【发布时间】:2015-11-10 05:55:57
【问题描述】:

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

用最简单的术语来说,我想以 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();
    }
]);

});

【问题讨论】:

    标签: node.js asynchronous express filesystems lpr


    【解决方案1】:

    您在exec() 的同一级别调用callback() 函数,exec 是异步的,并且在删除文件后将记录“文件打印”,因为在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();
        });        
    },
    

    【讨论】:

    • 我知道我错过了一些东西。这似乎成功了。谢谢
    【解决方案2】:
    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 
    

    有史以来最好的承诺结构

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2016-02-17
      • 2020-06-16
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2017-12-26
      • 1970-01-01
      相关资源
      最近更新 更多