从多个页面同步本地存储

时间:2017-09-29 11:55:50

标签: javascript google-chrome-extension

首先,对不起,我不知道如何更好地标题。

我正在制作Google Chrome扩展程序,其目的是从页面A 上的表格中读取表格列。这发生在我的 inject.js

var $tableRows = $("table tbody tr");
var offers = [];
var links = [];
$tableRows.each(function (index) {
    offers.push({
        code: $.trim($(this).find('td:nth-child(2)').text()),
        city: $.trim($(this).find('td:nth-child(6)').text()),
        state: $.trim($(this).find('td:nth-child(7)').text())
    });
    links.push($(this).find('td:first').find('a').attr('href'));

    if (index == $campaignTableRows.length - 1) {
        downloadPdfForOffers(offers, links);
    }
});

上面的代码创建了一个数组,其中包含表格中的信息,并保存每个商品资料的链接。

然后函数downloadPdfForOffers执行以下操作:

var downloadPdfForOffers = function (offers, links) {
    chrome.storage.local.set({"offers": offers}, function () {
        chrome.runtime.sendMessage({
            downloadUrlsReady: true,
            data: {links: links}
        });
    });
};

它在本地存储中设置我对这些优惠的当前信息,并将链接发送到background.js

然后从background.js,我在新标签中打开这些链接。

if (request.downloadUrlsReady) {
    for (var i = 0; i < request.data.links.length; i++) {
        chrome.tabs.create({url: request.data.links[i], active: true});
    }
}

在我的inject.js我等待页面加载优惠配置文件并使用jQuery获取我需要的其他信息,然后再将其发送到background.js

chrome.storage.local.get(["job_offers"], function (items) {
    if (items.job_offers && items.job_offers.length > 0) {
        var requirements = $("#j_id0\\:SiteTemplate\\:j_id747\\:j_id748").find('.margin-b3:first div.tcell:nth-child(2) div');
        var data = {
            file: {
                link: $('.btn.btn-link.btn-lg.vs2.margin-r2').attr('href'),
                name: $.trim($('#j_id0\\:SiteTemplate\\:j_id747\\:j_id767').text())
            },
            job_offer: {
                position: requirements.text()
            }
        };
        chrome.runtime.sendMessage({
            pdfUrlReady: true,
            data: data
        });
    }
});

然后在我的background.js我更新已设置的优惠并下载pdf:

if (request.pdfUrlReady) {
    console.log(request.data);
    chrome.storage.local.get(["job_offers"], function (items) {
        items.job_offers.forEach(function (job_offer, index) {
            if (job_offer.code == request.data.file.name) {
                items.job_offers[index] = $.extend(job_offer, request.data.job_offer);
                chrome.storage.local.set(items, function () {
                    chrome.downloads.download({
                        url: request.data.file.link,
                        saveAs: false,
                        filename: request.data.file.name + '.pdf'
                    }, function () {
                        chrome.tabs.remove(sender.tab.id);
                    });
                });
            }
        });
    });
}

console.log总是有我从单个页面传递的完整信息,但是当我更新chrome.storage.local时,有时我得不到有关该优惠的完整信息,可能是因为它&#39 ; s异步。

我该如何处理这种情况?

0 个答案:

没有答案