2017-02-10 73 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()) - 它會返回請求頁面的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

我使用生成器將所有代碼包裝到Promise中,並將其作爲'this.body = yield promise'運行。 – Mike

+0

好的。我的答案是否適合你? – Sangharsh