将chrome API操作封装到函数中

时间:2013-10-16 13:11:57

标签: javascript google-chrome-extension

这个问题可能很愚蠢,我刚刚开始学习chrome API。但在寻找答案时我真的很疲惫。我们在这里:

当我使用这种结构时,一切都很好:

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));

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

希望有一种方法来表达我想要的东西。

提前致谢。

1 个答案:

答案 0 :(得分:1)

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);
        });
    });
}

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

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

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

请记住,任何需要res值的代码必须放在回调中。回调之外的任何代码都无法保证(或实际上有负面保证)executeScript回调尚未解决。