2017-11-29 10 views
0

私はPhantomJSというURLを訪問して、並行してasync.map()を使用して保存する必要があります。 RAMを解放するために開かれたページを閉じる必要があることを考えると、私はpage.close()を使用する必要があると信じています。私はそれをしました。async.waterfall()と併用するとすぐにphantom.exit()が実行されます

しかし、終了したらPhantomを終了したいので、これを追加しようとしましたが、async.waterfall()ですぐに存在します。

どうすればこのようにすることができますか?

var fs = require("fs"); 
var async = require("async"); 

var urls = [ 
    {"url": "https://www.google.com", "html": "google"}, 
    {"url": "http://yahoo.com", "html": "yahoo"} 
]; 


async.waterfall([ 

    function (callback2) { 

    async.map(urls, function (a, callback) { 
     var resourceWait = 300, 
     maxRenderWait = 5000, 
     url = a.url; 

     var page = require('webpage').create(), 
     count = 0, 
     forcedRenderTimeout, 
     renderTimeout; 

     page.viewportSize = {width: 1440, height: 900}; 

     function doRender() { 
     var content = page.content; 

     var path = '../public/html/' + a.html + '.html'; 
     fs.write(path, content, 'w'); 
     page.close(); 

     } 

     page.onResourceRequested = function (req) { 
     count += 1; 
     clearTimeout(renderTimeout); 
     }; 

     page.onResourceReceived = function (res) { 
     if (!res.stage || res.stage === 'end') { 
      count -= 1; 
      if (count === 0) { 
      renderTimeout = setTimeout(doRender, resourceWait); 
      } 
     } 
     }; 

     page.open(url, function (status) { 
     if (status !== "success") { 
      console.log('Unable to load url'); 
     } else { 
      forcedRenderTimeout = setTimeout(function() { 
      doRender(); 
      }, maxRenderWait); 
     } 
     }); 
     callback(); 
    }); 

    callback2(null, 'done!'); 
    } 
], function (err, result) { 
    phantom.exit(); 
}); 

答えて

0

async.mapすべての並列呼び出しが完成し得れば呼び出すことができる第三引数としてコールバックを必要とします。そのコールバックの中でcallback2()に電話する必要があります。

あなたのコードは現在async.mapを起動してすぐにcallback2()を呼び出します。 async.mapコールバック内で呼び出す必要があります。

var fs = require("fs"); 
var async = require("async"); 

var urls = [ 
    {"url": "https://www.google.com", "html": "google"}, 
    {"url": "http://yahoo.com", "html": "yahoo"} 
]; 


async.waterfall([ 

    function (callback2) { 

    async.map(urls, function (a, callback) { 
     var resourceWait = 300, 
     maxRenderWait = 5000, 
     url = a.url; 

     var page = require('webpage').create(), 
     count = 0, 
     forcedRenderTimeout, 
     renderTimeout; 

     page.viewportSize = {width: 1440, height: 900}; 

     function doRender() { 
     var content = page.content; 

     var path = '../public/html/' + a.html + '.html'; 
     fs.write(path, content, 'w'); 
     page.close(); 

     } 

     page.onResourceRequested = function (req) { 
     count += 1; 
     clearTimeout(renderTimeout); 
     }; 

     page.onResourceReceived = function (res) { 
     if (!res.stage || res.stage === 'end') { 
      count -= 1; 
      if (count === 0) { 
      renderTimeout = setTimeout(doRender, resourceWait); 
      } 
     } 
     }; 

     page.open(url, function (status) { 
     if (status !== "success") { 
      console.log('Unable to load url'); 
     } else { 
      forcedRenderTimeout = setTimeout(function() { 
      doRender(); 
      }, maxRenderWait); 
     } 
     }); 
     callback(); 
    }, function() { 
     return callback2(null, 'done!'); 
    }); 
    } 
], function (err, result) { 
    phantom.exit(); 
}); 
関連する問題