将 chrome API 操作封装到函数中
Encapsulating chrome API operations into a functions
这个问题可能很愚蠢,我刚刚开始学习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
回调尚未解决。
相关文章:
- 在函数调用中封装数据除了隐藏数据之外还有什么优点
- 为什么封装的Javascript函数有如此巨大的性能差异
- Dijkstra's”;针对GOTO声明的案件“;与函数一样适用于现代调用代码的命名封装
- Javascript:正常函数的命名空间封装
- 为什么将函数引用封装到匿名函数中可以更正'这'指向
- 在封装的JavaScript函数中设置用于重用的私有变量
- 如何将 $http.put 封装到一个函数中,该函数执行某些操作,然后返回通过或失败的承诺
- 为什么我要在jQuery(function ($) { });中封装一个jQuery函数
- 将 chrome API 操作封装到函数中
- 用函数回调封装JavaScript
- 将D3函数封装在对象内部;不起作用.为什么?
- 将函数封装在jQuery.removeClass()中是否安全
- Javascript 函数封装
- 在onclick事件中将一个函数封装在另一个函数中究竟意味着什么?
- 尝试将此函数封装在对象中
- 函数封装变量是否未定义的检查
- JS函数封装
- 闭包编译器ADVANCED_OPTIMIZATIONS和函数封装
- 将一个函数封装在另一个函数中
- 对于jQuery,将函数封装在圆括号中有什么意义?