2016-07-20 5 views
0

でまずは、私がnode.jsと非同期プログラミングに慣れていないことを指摘しましょう。私のコードはおそらく本当に悪いです。私はwebdriverioとcheerioを使ってwebscrapperを構築しようとしています。このWebScrapperでは、コンテンツのページと結果のページの間を移動しながらクエリの結果をスクラップし、結果が使い果たされた後に新しいクエリを実行する必要があります。この私がこれまでに出ているコードは(クライアントがすでに開始されていることを前提として機能「make_new_query()」「.then()」アクションから呼び出されている)されていますWebdriverio

function scrapt_content(){ 
// if array of content links is exhausted -> move to next page or perform new query 
if(contents_pointer == contents.length){ 

    return client.isExisting("li.next-page > a").then(function(isExisting){ 
     // if there is a link to a a new page of results -> move to new page 
     if(isExisting){ 
      return change_pages(); 
     } else { 
      return make_new_query(); 
     }; 
    }); 

// change to new and scrapt it 
} else { 

    // var parsed = cheerio.load(res); 
    ... scrap content using cherio ... 
    . 
    . 
    . 
    contents_pointer++; 

    return scrapt_content(); 

    }) 
}; 
}; 

function change_pages(){ 

client 
    .click("li.next-page > a") 
    .getAttribute("h2 a", "href"); 
    .then(function(res){ 
     contents_pointer = 0; 
     news_links = res; 
     return scrapt_content(); 
    }) 
} 

function make_new_query(){ 
. 
. 
. 
client.url(new_query_url) 
    .getAttribute("h2 > a", "href") 
    .then(function(res){ 
     content_links = res; 
     return scrapt_content(); 
    }) 
} 
} 

問題は、スクラップするコンテンツの最初のページに移動した後(コードがクエリを実行し、content_linksの配列の最初のリンクにこのページを入力する)、Webdriverが終了します。これはコードが最初にscrapt_contentを呼び出し、途中で終了するchange_pages関数を実行するようなものです。だから、チェーンのアクションがこの関数にある間、私はエラーを想定しています。これらのアクションを連鎖しようとしている間に誰かが私の間違いを指摘できますか?

答えて

0

Webdriverを閉じる時点を知ることができないため、コードが不足している必要があります。ただし、非同期操作が完了する前に関数が返されないようにするには、約束を使用する必要があります。あなたがノードにいるのでほとんどのES6機能が組み込まれているので、コードの最上行に「use strict」を追加して(ES6機能を有効にして)、これを実行します(例えば、scrapt_content関数を使用してください:

//this function returns a promise 
 
function scrapt_content(){ 
 
    return new Promise(function(resolve, reject){ 
 
    InsertyourAsyncFunctionHere().then(function(){ 
 
     resolve(); 
 
    }); 
 
    }); 
 
}; 
 

 
//setting promise resolve/reject callbacks with then and catch 
 
scrapt_content.then(function(){ 
 
    //resolve (success) callback content here 
 
}).catch(function(err){ 
 
    //reject (error) callback contenthere 
 
    console.log(err.message) 
 
});

関連する問題