2017-02-10 18 views
0

nodejsでcurlを使用してデータを取得しようとしています。遅れなくデータを取得するために、各クエリに対して複数のchild_processを実行する必要があります。ノードjの複数のchild_process exec

router.post('/curl/', function*() { 

     var urls = this.request.body.url; 
     var exec = require('child_process').exec; 

     var promise = new Promise((resolve, reject) => { 

       var count = urls.length; 

       var res = _.map(urls, (stream) => { 
        // stream = {url:'http://url1.com'}; 

        var command = 'curl '+stream.url+'; 

        exec(command, (error, stdout, stderr) => { 
          if (error !== null) { 
           console.log('exec error: ' + error); 
          } 
          return stdout; 
        }); 
       }); 

       resolve(res); 
    }); 

     this.body = yield promise; 
}); 

解決:[null、null] '; Promise.mapを使用しようとしましたが、失敗しました。

リクエスト(_.map()なし)を1回だけ行うと、リクエストされたページのHTMLが返されます。 リクエストに複数のchild_processを実行するにはどうすればよいですか?

答えて

1

ここには発電機のない変形があります(function*)。 ジェネレータで何をしようとしているのかは不明です。

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

router.post('/curl/', function() { 

    function processUrl(url) { 
    return new Promise((resolve, reject) => { 
     var command = 'curl ' + stream.url; 
     exec(command, (error, stdout, stderr) => { 
     if (error) 
      return reject(error); 
     return resolve(stdout); 
     }); 
    }); 
    } 

    var urls = this.request.body.url; 

    var allPromises = urls.map(url => { 
    return processUrl(url); 
    }); 

    Promise.all(allPromises) 
    .then(htmls => { 
     console.log('HTML of pages:', htmls.length); 
    }); 
}); 
+0

私はジェネレータを使用してすべてのコードをプロミスにラップし、 'this.body = yield promise'として実行します。 – Mike

+0

私の答えはあなたのために働くのですか? – Sangharsh

関連する問題