将 chrome API 操作封装到函数中

Encapsulating chrome API operations into a functions

本文关键字:函数 封装 操作 chrome API      更新时间:2023-09-26

这个问题可能很愚蠢,我刚刚开始学习chrome API。但是在寻找答案时,我真的已经筋疲力尽了。我们到了:

当我使用这种结构时,一切都是 A-OK:

chrome.tabs.executeScript(tabID, { file: "jquery.js" }, function() {
    chrome.tabs.executeScript(tabID, { file: "script.js" }, function(res)   { 
        alert(res); // I can use this result inside this block
    });
});

问题是我想将此代码封装到这样的函数中:

function aFunction( tabID )
{
    chrome.tabs.executeScript(tabID, { file: "jquery.js" }, function() {
        chrome.tabs.executeScript(tabID, { file: "script.js" }, function(res)   { 
            return res;
        });
    });
}

然后我以这种方式使用该函数:

alert(aFunction(tabID));

此警报指令提供的消息是"未定义的"。我尝试了很多方法来编写函数,但我不断得到"未定义"作为返回结果。

希望有一种方法可以实现我想要的东西。

提前谢谢。

Chrome 扩展程序 API 是异步的,因此如果您将它们包装在函数中,则该包装函数无法根据异步结果同步返回值。包装函数必须在 Chrome API 回调函数开始之前声明其返回值。

您可以这样做:

function aFunction( tabID, callback )
{
    chrome.tabs.executeScript(tabID, { file: "jquery.js" }, function() {
        chrome.tabs.executeScript(tabID, { file: "script.js" }, function(res)   { 
            callback(res);
        });
    });
}

您可以向executeScript终止时运行的aFunction传递回调函数,而不是返回 res

aFunction(1234, function(resultArg) {
    alert("if you're seeing this, the inner executeScript finished");
    alert("it has result" + resultArg);
});

内部executeScript执行 callback(res) 调用,该调用以 res 作为其第一个参数传入aFunction的函数。

请记住,任何需要 res 值的代码都必须放在回调中。回调之外的任何代码都不能保证(或者实际上具有否定保证)executeScript回调尚未解决。