我正在尝试在nodejs上使用curl获取数据。我需要为每个查询运行多个child_process以便无延迟地检索数据。

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()),则它将返回所请求页面的HTML,这与我期望的一样。
如何为我的请求运行多个child_process?

最佳答案

这是没有生成器(function*)的变体。
目前尚不清楚您打算如何使用Generator。

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);
    });
});

10-07 22:30