Цепные обещания с Webdriverio

Во-первых, позвольте мне подчеркнуть, что я новичок в node.js и асинхронном программировании, поэтому мой код, возможно, действительно очень плохой. Я пытаюсь построить webscrapper, используя 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, а затем преждевременно завершает работу. Итак, я предполагаю, что ошибка в цепочке действий в этой функции. Кто-нибудь может указать на мои ошибки при попытке связать эти действия?

1 ответ

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

Другие вопросы по тегам