Chrome расширение: получить текст веб-страницы по указанному URL - PullRequest
0 голосов
/ 21 марта 2020

Сначала я полностью новичок ie, создающий расширение chrome, затем в части расширения chrome я получу разные URL-адреса и хочу сохранить текст веб-страницы для последующей обработки, в результате получается массив логических переменных, каждая из которых связана с данным URL. Схематически это будет примерно так:

var result;
function process(text){
  if something -> result.push(true);
  if not -> result.push(false);
}
function main(){
  for (i...){
    url = given[i];
    text = getHTMLText(url);
    process(text);
  }
  final();//when the loop finish activate another function that use the global variable: result
}

У меня проблемы с основной функцией, сначала я попробовал с синхронным XMLHttpRequest, хотя он работает очень медленно и chrome всегда выдает предупреждение, что синхронный XMLHttpRequest осуждается.

    for (var i = 0; i < urls.length; i++){
        url = urls[i];

        var req = new XMLHttpRequest();
        req.open('GET', url, false); 
        req.send(null);
        if (req.status == 200) detecting(req.responseText);
    };

Другое решение, которое я нашел, - это использовать fetch (url), но код, который я нахожу, мне не совсем понятен. Хотя возвращенный текст работает правильно, но тогда функция процесса выдает разные результаты при каждом обновлении страницы.

    for (var i = 0; i < urls.length; i++){
        url = urls[i];
        fetch(url).then(function(response) { 
            response.text().then(function(text) {
            detecting(text);
            });
        });
    };

Другая проблема, но это из-за того, что у меня мало знаний о fetch (), что я могу Не сохраняйте text из функции fetch (), каждый раз, когда я выполняю console.log, я получаю undefined, это значительно усложняет обработку текста для меня.

Я видел, что, возможно, это можно сделать через API расширения chrome, но я не вижу, как это сделать.

1 Ответ

1 голос
/ 22 марта 2020

Алгоритм, показанный в вашем псевдокоде main, может быть легко реализован с помощью async / await и Promise.all без for l oop:

(async () => {
  const results = await Promise.all(urls.map(processUrl));
  console.log(results);
  // further processing must be also inside this IIFE
})();

async function processUrl(url) {
  try {
    const text = await (await fetch(url)).text();
    return {url, text, status: detecting(text)};
  } catch (error) {
    return {url, error};
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...