我正在制作一个扩展程序,它有一个后台页面(和一个与之关联的脚本:eventPage.js)和一个内容脚本(work.js)
内容脚本扫描网页,并在数组中检索数据:
var datas = new Array();
var i = 0;
$('.szovegbox_kn tbody').each(function () {
var data = $(this).first("tr").find("td:nth-child(5)").html();
if (data !== undefined) {
datas[i] = data.replace(/\s/g, '');
chrome.runtime.sendMessage({
data: datas[i]
});
i++;
}
});
如您所见,当变量数据未定义时,data [i]会被发送到后台页面。
这是我的背景页面的脚本:
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
if (request.data !== undefined) {
var data = request.data;
var newURL = "http://www.something.com/loadpage.php?dest=" + data;
chrome.tabs.create({
url: newURL
});
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo) {
if (changeInfo.status === 'complete') {
window.setTimeout(function () {
chrome.tabs.remove(tabId);
}, 3000);
}
});
}
});
我想要做的是,当有效消息(其类型未定义)到达后台页面时,标签创建会延迟n秒,并且只有一个标签会被创建,直到标签获得关闭。现在,如果在我的datas []数组中有100条记录,我的后台页面会立即打开所有100个标签。我尝试使用setTimout,但没有成功。
TL; DR: 数据数组被发送到后台页面,逐个打开标签,它们之间有10秒的延迟。
如果您需要更多信息,我可以提供
答案 0 :(得分:1)
听起来你想要限制你的事件处理逻辑。
var tabCreationDelay = 10000; //milliseconds
var createTabThrottled = _.throttle(function(url){
chrome.tabs.create({
url: url
});
}, tabCreationDelay);
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
if (request.data !== undefined) {
var data = request.data;
var newURL = "http://www.something.com/loadpage.php?dest=" + data;
createTabThrottled(newURL);
}
// ...
});
在Underscore和Lo-Dash等库中实施了限制算法。