首先,让我指出我是node.js和异步编程的新手,所以我的代码可能非常糟糕。我正在尝试使用webdriverio和cheerio构建一个webscrapper。在这个webscrapper中,我必须进行查询,在内容页面和结果页面之间移动时废弃查询结果,然后在结果耗尽后执行新查询。这是我到目前为止所提出的代码(假设客户端已经启动并且函数" make_new_query()"正在从" .then()&#34调用;行动):
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关闭。这就像代码首先执行函数change_pages一样,它调用scrapt_content而不是提前终止。所以,我在这个函数中使用链接动作时假设错误。在尝试将这些行为联系起来时,有人能指出我的错误吗?
答案 0 :(得分:0)
你必须缺少一些代码,因为我无法判断你正在关闭webdriver。但是,您需要使用promise来确保函数在异步操作完成之前不会返回。由于您在节点中,因此您拥有内置的大多数ES6功能,因此您可以添加"使用严格的"在代码的最顶部(启用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)
});