JavaScript 回调/异步问题? Chrome 扩展程序的后台脚本在完成之前停止功能

Posted

技术标签:

【中文标题】JavaScript 回调/异步问题? Chrome 扩展程序的后台脚本在完成之前停止功能【英文标题】:JavaScript callback / async problem? Background script of Chrome Extension stops function before finishing 【发布时间】:2022-01-06 12:26:53 【问题描述】:

我正在尝试创建一个小型爬虫作为 chrome 扩展。它的工作原理是: 打开新窗口或标签。 使用给定的关键字搜索 Google / Google News / YouTube。 将结果信息存储在小型数据库中

我首先使用 popup.html 创建并测试了这些函数。它在那里完美运行。您单击一个按钮,所有页面都被访问,结果存储在数据库中。但我想在不先点击任何东西的情况下启动程序。这就是我将它迁移到 background.js 的原因。它也可以在那里工作,但前提是 Service Worker / DevTool 控制台是打开的。只有这样它才能完全运行。

如果有任何有用的答案,我将不胜感激。

const keywords = [
    "Keyword1",
    "Keyword2",
    // ...
    "Keyword13"
];

chrome.runtime.onStartup.addListener(() => 
    chrome.tabs.onUpdated.addListener(loadingWindow);
    openWindow();
);

// Opens new Window or Tab with the correct URL
function openWindow() 
    chrome.tabs.onUpdated.addListener(loadingWindow);
    if (runs == 0) 
        chrome.windows.create( url: getUrl(keywords[runs]), type: "normal" , newWindow => 
            window_id = newWindow.id;
        );
     else 
        chrome.tabs.update(tab_id,  url: getUrl(keywords[runs]) );
    


// Wait to load the new tab
function loadingWindow(tabId, changeInfo, tab) 
    if (changeInfo.status === 'complete' && tab.status == 'complete' && tab.windowId == window_id) 
        tab_id = tabId;
        console.log(tab.windowId);
        chrome.tabs.onUpdated.removeListener(loadingWindow);
        chrome.tabs.sendMessage(tab.id,  text: source , doStuffWithDom);
    
;

// Get information from content script -> payload and then send to database
function doStuffWithDom(domContent) 
    let payload = ... 
    var data = new FormData();
    data.append("json", JSON.stringify(payload));
    fetch(".../store.php",  method: "POST", body: data );
    crawlDone();


// open new window / tab or close the open window
function crawlDone() 

    runs++;
    if (runs < keywords.length) 
        openWindow();
     else if (runs == keywords.length) 
        chrome.windows.remove(window_id);
    
;

【问题讨论】:

【参考方案1】:

我切换到 Manifest 版本 2。然后我可以通过 Background.html 包含 Background.js,它也运行到最后。

【讨论】:

以上是关于JavaScript 回调/异步问题? Chrome 扩展程序的后台脚本在完成之前停止功能的主要内容,如果未能解决你的问题,请参考以下文章

异步 JavaScript - 回调与延迟/承诺 [重复]

Javascript - 在这个例子中异步并行的回调发生了啥?

JavaScript异步编程__“回调地狱”的一些解决方案

所有的javascript回调都是异步的吗?如果不是,我怎么知道哪些是?

是否可以捕获 JavaScript 异步回调中抛出的异常?

JavaScript的异步编程