Map.get()在异步函数中返回未定义的

时间:2019-11-01 00:45:50

标签: javascript async-await cacheapi

我想获取Cache API中存在的所有不同缓存的列表,以及每个缓存有多少资产。即使我设法返回了带有信息的Map对象,但是在调用Map.get(cacheName)时仍未定义。

我已经看到,一旦页面加载完毕,如果我手动运行'cacheInfo = getCacheInfo()',则cacheInfo.get()就会起作用。

function getCacheInfo() {
  const cacheMap = new Map();
  window.caches.keys().then(function(cacheNames) {
    cacheNames.forEach(function(cacheName) {
      window.caches
        .open(cacheName)
        .then(function(cache) {
          cacheMap.set(cacheName, 0);
          return cache.keys();
        })
        .then(function(requests) {
          requests.forEach(function(request) {
            cacheMap.set(cacheName, cacheMap.get(cacheName) + 1);
          });
        });
    });
  });
  return cacheMap;
}

async function printTable() {
  const cacheInfo = await getCacheInfo();
  console.log(cacheInfo);
  console.log(cacheInfo.get('html-cache')); // Returns undefined
}

printTable();

1 个答案:

答案 0 :(得分:1)

您将<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <ul id="a"> <li>list</li> <li>list</li> <li>list</li> <li>list</li> </ul> <ul id="b"></ul>async/await语法混合使用,是为了什么?最佳做法是仅使用.then或Promise解决语法,而不是同时使用两者。

对于您而言,我认为async/await是最佳选择,我将您的代码转换为使用async/await语法。我认为您需要(也许)阅读更多有关async/await的信息,以了解它们。

Promise, async/await