JavaScript没有';不要等待循环
我正在做谷歌浏览器的扩展。我正在尝试打开新选项卡并对它们进行分组。我将URL作为数组。但chrome.tabs.group功能不会等到所有选项卡都打开时才启动JavaScript没有';不要等待循环,javascript,asynchronous,google-chrome-extension,Javascript,Asynchronous,Google Chrome Extension,我正在做谷歌浏览器的扩展。我正在尝试打开新选项卡并对它们进行分组。我将URL作为数组。但chrome.tabs.group功能不会等到所有选项卡都打开时才启动 var ourTabIds = [] for(const url of urls) { chrome.tabs.create({active: false, url : url},tab => { ourTabIds.push(tab.id) }) } chrome.tabs.group({tabI
var ourTabIds = []
for(const url of urls) {
chrome.tabs.create({active: false, url : url},tab => {
ourTabIds.push(tab.id)
})
}
chrome.tabs.group({tabIds : ourTabIds}, groupId => {console.log(groupId)})
当ourtabid仍然为空时,group函数起作用。所以它给出了错误
为什么它不等待?如何修复此问题?函数
chrome.tabs.create()
使用回调作为参数。您应该将其转换为承诺并使用.then()完成所有操作,或者检查它是否是最后一个url(从的更改为中的)
var ourTabIds = [];
var countTabs = 0;
for(const url of urls) {
chrome.tabs.create({active: false, url : url},tab => {
ourTabIds.push(tab.id)
countTabs++;
if (countTabs==urls.length){
chrome.tabs.group({tabIds : ourTabIds}, groupId => {console.log(groupId)})
}
})
}
您可以chrome.tabs
然后使用Promise.all
function createTab(input){
return new Promise(resolve => {
chrome.tabs.create(input,tab => resolve(tab))
});
}
然后你的代码就变成了
(async function doIt(){
var tabs = await Promise.all(urls.map(url => createTab({active: false, url : url})));
chrome.tabs.group({tabIds : tabs.map(t => t.id)}, groupId => {console.log(groupId)})
})()
这回答了你的问题吗?在
create
回调中添加代码,将ourTabIds.length
与url.length
进行比较,并在两者相等时调用group
。是的,此解决方案和其他使用链接长度的解决方案都有效,谢谢。但我不明白为什么我的第一个代码不等待?这不是等待。这不是回调的工作方式。请看:这是一个更酷的解决方案是的,但我必须理解,通常在我编写循环时,循环下面的代码不是要等到循环完成吗?@I2mNew在您的原始代码中,不是。因为您正在进行的调用是异步的(请参阅您的问题下的链接)。在此代码中,是的,第二行(组行)等待第一行返回complete@I2mNew它会“等待”直到循环完成。因为chrome.tabs.create()
是一个异步过程,所以循环在调用create
方法之前很久就结束了。这就是它首先使用回调的全部原因。@Lennholm这就是我想说的,谢谢你比我更简洁。
(async function doIt(){
var tabs = await Promise.all(urls.map(url => createTab({active: false, url : url})));
chrome.tabs.group({tabIds : tabs.map(t => t.id)}, groupId => {console.log(groupId)})
})()