2014-09-13 3 views
0

나는 wordpress svn repo에서 최신 wordpress 플러그인을 설치하는 불만스런 작업을하고 있습니다.이 작업은 명령 줄 작업을 통해 수행됩니다. 그래서 하나의 잘 var done = this.async()done(error) 작품을 사용하여 각 플러그인 (svn co를 통해) 설치로 내가 출력을 볼 수 있도록Grunt 사용자 정의 작업 내에서 여러 비동기 요청을 처리하는 방법은 무엇입니까?

은 이상적으로이 동 기적으로 수행 싶습니다 ..하지만 exec 단순히 실행 및 대기하지 않는 것처럼 보인다 비동기 동작이지만이 경우에는 여러 개가 아닙니다 ... 무엇을 놓치고 있습니까? 여기

grunt.registerTask('install-plugin', 'Get latest versions of required plugins', function(p){ 
    var exec = require('child_process').exec; 
    var plugins = p ? [p] : grunt.config.get('wp_plugins'); 
    var pattern = 'svn co http://plugins.svn.wordpress.org/%s/tags/$(curl -s http://plugins.svn.wordpress.org/%s/trunk/readme.txt | grep "Stable tag:" | sed -E "s/[Ss]table tag: *//")/ plugins/%s' 
    var done = this.async(); 
    plugins.forEach(function(plugin) { 
     // using split/join instead of util.format('foo%s', 'bar') 
     var cmd = pattern.split("%s").join(plugin); 
     exec(cmd, function (error, stdout, stderr) { 
      grunt.log.writeln('Installing WordPress Plugin: "' + plugin + '"'); 
      grunt.log.writeln(stdout); 
      done(error); 
     }); 
    }); 
}); 

답변

0

귀하의 문제는 당신이 루프를 통해 (일명 this.async())마다 done를 호출하지만 툴툴 거리는 소리는 당신이 루프를 모르는 것입니다. 모든 비동기 작업이 완료된 시점을 추적하고 나서 grunt의 this.async()를 호출하면 자신 만의 콜백이 필요합니다.

다른 방법으로 웹에서 "node exec synchronous"를 검색하면 원하는 경우 해당 작업을 수행 할 수있는 많은 방법을 찾을 수 있습니다.

0

stdout 메시지가 나타나기 전에 done으로 전화를 걸고 있습니다. 이벤트가 실제로 완료되었을 때 알림을 받으려면 이벤트 수신을 기다립니다.

exec(cmd, function (error, stdout, stderr) { 
     stdout.on('data', function(data){ 
      grunt.log.writeln('Installing WordPress Plugin: "' + plugin + '"'); 
      grunt.log.writeln(stdout); 
      done(); 
     }); 

     stderr.on('data', function(err){ 
      done(err); 
     }); 
    }); 
관련 문제