在 nodejs 中依次 运行 函数

sequentially run functions in nodejs

我是 node 的新手,运行 遇到了 运行 按顺序执行某些函数和使用回调的问题。我曾尝试使用 async 模块,但是,我想我遗漏了一些东西,因为它会乱序执行我的功能。

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

我当前的代码在第 printing.ie 步 2.Would 之前的第 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();
    }
]);

});

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

有史以来最好的承诺结构