2015-11-05 118 views
0

我对节点很陌生,遇到了按顺序运行某些函数和使用回调的问题。我曾尝试使用异步模块,但是,我认为我错过了一些东西,因为它不按顺序执行我的功能。按顺序运行nodejs中的函数

在最简单的话来说,我想在网址参数,然后的形式来获取一些数据: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(); 
    } 
]); 

});

回答

0

您正在调用exec()callback()函数,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(); 
    });   
}, 
+0

我知道我失去了一些东西。这似乎已经成功了。谢谢 – neohusky

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 

有史以来最好的保证结构