Javascript 函数不访问扩展中的Chrome存储值

Javascript 函数不访问扩展中的Chrome存储值,javascript,google-chrome,google-chrome-extension,google-chrome-storage,Javascript,Google Chrome,Google Chrome Extension,Google Chrome Storage,我正在开发一个chrome扩展,它可以将给定页面上的pries转换为用户需要工作的小时数,以赚取该金额。扩展通过弹出窗口接收用户工资信息,然后在chrome存储器中设置。那部分很好用 我遇到的问题是访问该值并使用它来运行计算。JS可以很好地解析这些值并调用convert函数,但在计算中只使用占位符hourly值1,而不是从chrome存储中检索它。相反,它似乎在所有解析之后访问chrome存储(我根据控制台日志运行的时间来计算) 你知道这是什么原因吗?我尝试将整个解析移到它自己的函数中,以便在$

我正在开发一个chrome扩展,它可以将给定页面上的pries转换为用户需要工作的小时数,以赚取该金额。扩展通过弹出窗口接收用户工资信息,然后在chrome存储器中设置。那部分很好用

我遇到的问题是访问该值并使用它来运行计算。JS可以很好地解析这些值并调用convert函数,但在计算中只使用占位符hourly值1,而不是从chrome存储中检索它。相反,它似乎在所有解析之后访问chrome存储(我根据控制台日志运行的时间来计算)

你知道这是什么原因吗?我尝试将整个解析移到它自己的函数中,以便在$(document).ready(函数)末尾调用,但它仍然无法从chrome存储中获取值

在content.js中:

function convert(price){
    var hourly = 1;
    chrome.storage.sync.get('hourly', function(result){
        hourly = result.hourly;
        console.log(hourly);
    });
    return price / hourly;
}

var elements = document.getElementsByTagName('*');

for (var i = 0; i < elements.length; i++) {
var element = elements[i];

    for (var j = 0; j < element.childNodes.length; j++) {
        var node = element.childNodes[j];

        if (node.nodeType === 3) {
            var text = node.nodeValue;
            if (text[0] == '$'){
                if (/\s/.test(text)){
                    var price = text.substring(0, text.indexOf(' '));
                    var priceNum = text.substring(1, text.indexOf(' '));
                    var time = convert(parseFloat(priceNum));
                    var timeStr = time.toFixed(2);
                    if (text.length > 5){
                        var remainder = text.substring(4);
                        var nextPrice = remainder.indexOf('$');
                        if (nextPrice != -1){
                            var priceTwo = remainder.substring(nextPrice);
                        }
                        var priceTwo = null;
                    }
                }
                else {
                    var price = text.substring(0);
                    var priceNum = text.substring(1);
                    var time = convert(parseFloat(priceNum));
                    var timeStr = time.toFixed(2);
                }
            }
            var replacedText1 = text.replace(price, timeStr);
            if (replacedText1 !== text) {
                element.replaceChild(document.createTextNode(replacedText1 + ' hours'), node);
            }
        }
    }
}
函数转换(价格){
var小时=1;
chrome.storage.sync.get('hourly',函数(结果){
小时=结果。小时;
控制台日志(每小时);
});
返回价格/小时;
}
var elements=document.getElementsByTagName('*');
对于(var i=0;i5){
var余数=文本。子字符串(4);
var nextPrice=rements.indexOf(“$”);
如果(nextPrice!=-1){
var priceTwo=余数.substring(nextPrice);
}
var-priceTwo=null;
}
}
否则{
var price=text.substring(0);
var priceNum=text.substring(1);
var-time=convert(parseFloat(priceNum));
var timeStr=固定时间(2);
}
}
var replacedText1=text.replace(price,timeStr);
if(replacedText1!==文本){
元素.replaceChild(document.createTextNode(replacedText1+'hours'),节点);
}
}
}
}

chrome.storage.sync.get通过回调异步返回结果。您可以通过将chrome.storage.sync.get包装到Promise中,然后在
外部接收解析数据,然后在
函数中接收解析数据,从而获得结果:

function convert(price){
    var hourly = 1;
    return new Promise(function(resolve, reject) {
        chrome.storage.sync.get('hourly', function(result){
            hourly = result.hourly;
            resolve(price / hourly);
        });
    });
}

var elements = document.getElementsByTagName('*');

for (var i = 0; i < elements.length; i++) {
var element = elements[i];

    for (var j = 0; j < element.childNodes.length; j++) {
        var node = element.childNodes[j];

        if (node.nodeType === 3) {
            var text = node.nodeValue;
            if (text[0] == '$'){
                if (/\s/.test(text)){
                    var price = text.substring(0, text.indexOf(' '));
                    var priceNum = text.substring(1, text.indexOf(' '));
                    if (text.length > 5){
                        var remainder = text.substring(4);
                        var nextPrice = remainder.indexOf('$');
                        if (nextPrice != -1){
                            var priceTwo = remainder.substring(nextPrice);
                        }
                        var priceTwo = null;
                    }
                }
                else {
                    var price = text.substring(0);
                    var priceNum = text.substring(1);
                }
            }
            convert(parseFloat(priceNum)).then(function(time) {
                var timeStr = time.toFixed(2);
                var replacedText1 = text.replace(price, timeStr);
                if (replacedText1 !== text) {
                    element.replaceChild(document.createTextNode(replacedText1 + ' hours'), node);
                }
            });
        }
    }
}
函数转换(价格){
var小时=1;
返回新承诺(功能(解决、拒绝){
chrome.storage.sync.get('hourly',函数(结果){
小时=结果。小时;
解决(价格/小时);
});
});
}
var elements=document.getElementsByTagName('*');
对于(var i=0;i5){
var余数=文本。子字符串(4);
var nextPrice=rements.indexOf(“$”);
如果(nextPrice!=-1){
var priceTwo=余数.substring(nextPrice);
}
var-priceTwo=null;
}
}
否则{
var price=text.substring(0);
var priceNum=text.substring(1);
}
}
转换(parseFloat(priceNum)).then(函数(时间){
var timeStr=固定时间(2);
var replacedText1=text.replace(price,timeStr);
if(replacedText1!==文本){
元素.replaceChild(document.createTextNode(replacedText1+'hours'),节点);
}
});
}
}
}

chrome.*API是异步的。请参阅可能的副本