2015-11-05 94 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 

有史以來最好的保證結構