首页 > 解决方案 > 使用 Chrome 扩展程序/JavaScript 循环遍历 URL 数组

问题描述

我正在尝试遍历 URL 数组并在每个 URL 上运行一个函数。该代码正在运行,但它仅针对第一个 URL 运行。

这是 popup.js(相关代码所在的位置):

document.addEventListener('DOMContentLoaded', function () {
  document.querySelector('#scanInventory').addEventListener('click', getInventory, false);
  
  async function getInventory () {
    for (let page = 1; page < 5; page++) {
        await new Promise((resolve) => {
            let url = `https://example.com?page=${page}`;
            chrome.tabs.update({ url, active: true }, (tab) => {
                chrome.tabs.onUpdated.addListener(function onUpdated(tabId,info) {
                    chrome.tabs.query({
                        currentWindow: true, active: true}, 
                        function (tabs) {
                            chrome.tabs.sendMessage(tabs[0].id, 'getInventory');
                        })
                    })
                });
            });
        };
    }
}, false)

如何让循环继续通过第一项?

标签: javascriptgoogle-chrome-extension

解决方案


你不调用解析函数来验证工作结束,所以它卡在第一个

这是一个小例子,展示了如何运行并发或顺序作业集的承诺

function job( i, type ){
  console.log( type,"[ launch job #",i )
  return new Promise( (resolve, reject) => {
    setTimeout( ()=>{
      console.log( type, "[ job #",i,"done" );
      resolve( true );
    }, i*1000 );
  } );
}

async function concurrentPromise( n ){
  let promiseArray = [];
  while(n) promiseArray.push( job( n--, "concurrent" ) );
  await Promise.all( promiseArray )
  .then( results => {
    console.log("concurrent, all done!\n", results );
  } );
}

async function sequentialPromise( n ){
  let results = [];
  while(n) results.push( await( job( n--, "sequential" ) ) );
  console.log("sequential, all done!\n", results );
}

concurrentPromise( 5 ) ;

sequentialPromise( 5 ) ;

推荐阅读