Javascript 将ChromeAPI操作封装到函数中

Javascript 将ChromeAPI操作封装到函数中,javascript,google-chrome-extension,Javascript,Google Chrome Extension,这个问题可能很愚蠢,我刚刚开始学习ChromeAPI。但在寻找答案的时候,我真的已经筋疲力尽了。我们到了: 当我使用这种结构时,一切都正常: chrome.tabs.executeScript(tabID, { file: "jquery.js" }, function() { chrome.tabs.executeScript(tabID, { file: "script.js" }, function(res) { alert(res); // I can us

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

当我使用这种结构时,一切都正常:

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是异步的,因此如果将它们包装在函数中,包装函数将无法基于异步结果同步返回值。包装函数必须在chromeapi回调函数开始之前声明其返回值

您可以这样做:

function aFunction( tabID, callback )
{
    chrome.tabs.executeScript(tabID, { file: "jquery.js" }, function() {
        chrome.tabs.executeScript(tabID, { file: "script.js" }, function(res)   { 
            callback(res);
        });
    });
}
您可以将回调函数传递给
executeScript
终止时运行的
a函数,而不是返回
res

aFunction(1234, function(resultArg) {
    alert("if you're seeing this, the inner executeScript finished");
    alert("it has result" + resultArg);
});
内部
executeScript
执行
callback(res)
调用,该调用调用传递到
a函数中的函数,并将
res
作为其第一个参数


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

这是一个异步调用!它不会像那样工作的。原始函数调用在executeScript行运行之前返回。因为函数中没有返回,所以您得到未定义的。是的,我理解这一点),但我认为将返回指令放入一个我们真正得到响应的块中可以解决问题。@ITcrusader它不起作用,因为
a函数
必须声明其返回值并在调用
executeScript
之前终止。因此,
executeScript
不可能影响
a函数的返回值。谢谢!它确实解决了我的函数分解问题=)