2014-10-31 138 views
0

在我的項目中,我正在使用2個異步方法。第一種方法打開一個Applescript,它打開一個After Effects項目並加載一個jsx文件(在After Effects項目中調整項目)。第二種方法呈現調整後的After Effects項目並將其呈現給.mp4文件。NodeJS http請求處理程序

第一種方法的問題是,它可以很好地打開After Effects,但它只能打開After Effects的一個實例,因爲After Effects一次只允許打開1個After Effects項目。

如果有多個HTTP請求代碼,After Effects會引發錯誤。因爲它必須同時打開多個After Effects項目,這是不允許的。

我正在尋找一種方法來對此方法的HTTP請求進行排隊,以便After Effects可以打開一次,並在幾秒鐘後執行第二個請求,並且After Effects將再次打開並再次打開...有沒有在NodeJS中這樣做的方法?因爲我的代碼不會這樣做,並且我無法在net/stackoverflow上找到解決方案。

exports.renderProject = function (req, res) { 

async.series([ 
     function (callback) { 
      callback(); 
     }, 
     function (callback) { 

      var template = req.body[0].template; //project to render (.aep file) 

      //OSX editproject 
      var editProject = executablepathOSX + " " + template + " " + template + ".jsx" + " " + guid /*retValVacancyList[0].animation.template*/ 

      var sys = require('sys'); 
      var exec = require('child_process').exec; 
      var child; 

      // executes 'edit project' 
      child = exec(editProject, function (error, stdout, stderr) { 
       sys.print('stdout: ' + stdout); 
       sys.print('stderr: ' + stderr); 
       if (error !== null) { 
        console.log('exec error: ' + error); 
       } 
       callback(); 
      }); 

     }, 
     function (callback) { 

      var renderProject = shellscript + "renderMp4.sh " + guid + ".aep " + guid + ".mp4"//guid + ".avi" //animation.template .avi name(guid) 

      var sys = require('sys'); 
      var exec = require('child_process').exec; 
      var child; 

      // executes 'render project' 
      child = exec(renderProject, function (error, stdout, stderr) { 
       sys.print('stdout: ' + stdout); 
       sys.print('stderr: ' + stderr); 
       if (error !== null) { 
        console.log('exec error: ' + error); 
       } 
       callback(); 
      }); 
     } 

回答

0

你可以使用async.queue

var exec = require('child_process').exec; 

var aequeue = async.queue(function(template, callback) { 
    var editProject = executablepathOSX + ' ' + template + ' ' + template + '.jsx' + ' ' + guid /*retValVacancyList[0].animation.template*/ 

    // executes 'edit project' 
    exec(editProject, function(error, stdout, stderr) { 
    callback(error); 
    }); 
}, 1); 

async.series([ 
    function (callback) { 
     callback(); 
    }, 
    function (callback) { 
    aequeue.push(req.body[0].template, callback); 
    }, 
    function (callback) { 
    var renderProject = shellscript + "renderMp4.sh " + guid + ".aep " + guid + ".mp4"//guid + ".avi" //animation.template .avi name(guid) 

    // executes 'render project' 
    exec(renderProject, function(error, stdout, stderr) { 
     callback(error); 
    }); 
} 
+0

我的推杆的aequeue到JS路線的 '全球' 的一部分。現在它效果很好!謝謝你的幫助! – user3374131 2014-11-03 10:52:05