Обещания с Webdriverio

Во-первых, позвольте мне отметить, что я новичок в node.js и асинхронном программировании, поэтому мой код, вероятно, действительно плох. Я пытаюсь создать веб-скребок, используя webdriverio и cheerio. В этом веб-скребке я должен выполнить запрос, очистить результаты запроса при перемещении между страницами содержания и страницами результатов, а затем выполнить новый запрос после того, как результаты будут исчерпаны. Это код, который я придумал до сих пор (предположим, что клиент уже был инициирован и функция make_new_query () вызывается из действия .then ()):

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), веб-драйвер закрывается. Это похоже на то, что код сначала выполняет функцию change_pages, которая вызывает scrapt_content, а затем преждевременно завершается. Итак, я предполагаю, что ошибка при связывании действий находится в этой функции. Может ли кто-нибудь указать на мои ошибки при попытке связать эти действия?


person lspinheiro    schedule 20.07.2016    source источник


Ответы (1)


Вам, должно быть, не хватает кода, потому что я не могу сказать, в какой момент вы закрываете веб-драйвер. Однако вам нужно использовать обещание, чтобы гарантировать, что функция не вернется до завершения асинхронных операций. Поскольку вы находитесь в узле, у вас есть большинство встроенных функций 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)
});

person mags    schedule 01.08.2016