2016-03-23 35 views
0

Taranacak web siteleri listesini getiren düğüm kodum var ve sonuçta yinelenen, fantom kullanılarak yazılmış bir tarama işlevini çağırıyor. Ancak tarama fonksiyonu sonucu döndürmeden önce, döngü tekrarlama sayısını artırır ve dolayısıyla tarama işlevine çağrı yapamayan çağrı sayısıdır. Sorunum için hemen yanıt vermem gerekiyor. Lütfen birisi beni bu kuyudan çıkar.node.js işlev çağrısı yinelemeden önce işlev çağrısı yineleme yinelenen nesne sorunu yaratılıyor

benim ana sayfa kodu

db.fetch_serviceEntity(function(serviceEntityData){ 
     if(serviceEntityData!=""){ 
     serviceEntityData.forEach(function(item){ 
      console.log(item.website_url); 
      db.fetch_entityId(item.id,function(entityId){ 
       crawler.getCount(item.website_url, item.name, function(rCount){ 
        console.log("number of fresh reviews to crawl : ", parseInt(rCount) - parseInt(item.review_count)); 
        if(rCount > item.review_count){ 
         fetchReviews(item.website_url, entityId.id, parseInt(rCount) - parseInt(item.review_count), function(){ 
          db.updateReviewCount(item.id, rCount, function(){ 
           process.exit(0);  
          }); 
         }); 
        } 
       }); 
      }); 
      };  
     }); 
     } 
     else { 
     console.log("No websites to crawl/database error"); 
     } 
     process.exit(0); 
    }); 

benim tarama fonksiyonu burada

crawler.prototype.crawl = function(webUrl, callback){ 
    console.log(webUrl); 
    this.driver.create({ path: require('phantomjs').path }, function (err, browser) { 
     return browser.createPage(function (err,page) { 
     return page.open(webUrl, function (err,status) { 
      console.log("opened site? ", status); 
      page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js', function (err) { 
      // Wait for a bit for AJAX content to load on the page. Here, we are waiting 5 seconds. 
      setTimeout(function() { 
       return page.evaluate(function() { 
       //Get what you want from the page using jQuery. 
       var reviews = []; 
       $('li div.review').each(function() { 
        if($(this).find('div.ypassport').text()){ 
        var d = new Date($(this).find('span.rating-qualifier').text().trim()); 
        var temp = { 
         id : $(this).attr('data-review-id'), 
         entity_id : "", 
         user_id : $(this).attr('data-signup-object').split(":")[1], 
        } 
        reviews.push(temp); 
        } 
       }); 

       return { 
        reviews: reviews 
       }; 
       }, function (err,result) { 
       browser.exit(); 
       callback(result); 
       }); 
      }, 5000); 
      }); 
     }); 
     }); 
    }); 

}; Bunu yazılı tarama fonksiyonu için düğüm-fantom-basit kullanıyorum

burada benim problem olduğunu - döngü için kendisine çağrı sayısını yaptığından>, tarama fonksiyonu bana hata veren bir kısmını veya başka bir nesnenin o oluşturulmadı. Örneğin kodda "createpage undefined işlevi değil" ifadesiyle, bu nedenle tarayıcı nesnesi oluşturulmamıştır. bazen "açık, tanımlanmamış bir işlev değil", dolayısıyla "sayfa" nesnesinin oluşturulmadığını belirtir.

+1

(Bunun, kodu. Bir geri arama cehennem. Belki daha küçük işlevler oluşturmak istiyorum, sonra async veya co hatta elle gibi bir kütüphane ile zincirleyin), ama okumak için kod ... Ayrı işlevleri veya harici kütüphaneleri kullanmayı deneyin, hatta ES6'ya gidip vaatleri kullanın. – Drakoumel

+1

Evet, vaatlerle çalışıyorum .. teşekkürler. – Mallikarjun

+0

yazıyorsa, söz veriyorum. Q veya Bluebird kütüphaneleri sağlam. Sahip olduğunuz bu tür yuvalama genellikle Doom Piramidi olarak anılır: https://en.wikipedia.org/wiki/Pyramid_of_doom_(programming) –

cevap

0

Async işlevleriniz var, ancak ilk işlevinizden döndüğünüzde process.exit(0) ise, tüm veritabanı bağlantıları atılıyor ve db.updateReviewCount numaralı telefon çağrılıyor. Yani, önce kimin kapandığına bağlı olarak, daha fazla veya daha az rastgele sonuç alırsınız.

bazı zor şu hiçbir alınma

+0

Öneri için teşekkürler, aslında çıkış bölümünü yorumladım. çalışırken ve db ile bir sorun veya çıkış işlemi. sadece sorun async bölümü ile. – Mallikarjun

İlgili konular