2014-10-31 2 views
0

내 프로젝트에서 나는 2 개의 비동기 메소드를 사용하고있다. 첫 번째 방법은 AppleScript를 열어 After Effects 프로젝트를 열고 jsx 파일을로드하여 After Effects 프로젝트의 항목을 조정합니다. 두 번째 방법은 조정 된 After Effects 프로젝트를 렌더링하고 .mp4 파일로 렌더링합니다.NodeJS http 요청 처리자

첫 번째 방법의 문제점은 After Effects를 열 수는 있지만 After Effects에서는 한 번에 하나의 After Effects 프로젝트 만 열 수 있기 때문에 After Effects의 인스턴스를 하나만 열 수 있다는 것입니다.

코드에 대한 HTTP 요청이 여러 개인 경우 After Effects에서 오류가 발생합니다. After Effects 프로젝트를 여러 번 열어야하므로 허용되지 않습니다.

이 메서드에 대한 HTTP 요청 대기열을 찾고있어 After Effects를 한 번 열 수 있고 2 초 후에 두 번째 요청이 수행되고 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

은 내가 JS 노선의 '글로벌'부분에 aequeue을 가볍게 쳤다. 이제는 훌륭하게 작동합니다! 당신의 도움을 주셔서 감사합니다! – user3374131