JavaScript没有';不要等待循环

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

我正在做谷歌浏览器的扩展。我正在尝试打开新选项卡并对它们进行分组。我将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({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)})

})()