这个问题可能很愚蠢,我刚刚开始学习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));
此警报指令提供的消息是“未定义”。我尝试了很多方法来编写函数,但我总是将“未定义”作为返回结果。
希望有一种方法来表达我想要的东西。
提前致谢。
答案 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
回调尚未解决。