2015-11-05 5 views
0

Я очень новичок в узле и столкнулся с проблемами при выполнении некоторых функций последовательно и использовании обратных вызовов. Я попытался использовать асинхронный модуль, но, я думаю, что у меня что-то не хватает, потому что он выполняет мои функции не по порядку.последовательно запускать функции в nodejs

В самых простых словах я хотел бы получить некоторые данные в виде URL-адрес Params и затем: 1. записать их в файл 2. LPR распечатывали 3. удалить файл

Моих текущий код удаляет файл перед печатью. Шаг 3 перед шагом 2. Кто-нибудь может предложить некоторые советы о том, как лучше всего их выполнить? Заранее спасибо.

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

Вы вызываете callback() функцию на том же уровне exec(), 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(); 
    });   
}, 
+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 

лучших когда-либо обещать структурировать

 Смежные вопросы

  • Нет связанных вопросов^_^