javascript - 从 service worker 返回带有 JSON 的 Response 对象

标签 javascript promise service-worker indexeddb web-worker

我正在尝试连接到某些 JSON 的获取请求,并检查数据是否在 IndexedDB 中以在进入网络之前获取它。我认为我的 promise 没有兑现,但发生了一些奇怪的事情。

这是我的代码:

event.respondWith(async function() {
        var data = {success:true, msg:'', data: []};

        localforage.iterate(function(value, key) {
            data.data.push([key, value])
        })
        if (data.data.length > 0) {
            return await new Response(JSON.stringify(data),{
                headers: { "Content-Type" : "application/json" }
            });
        }

        let response = await fetch(event.request)
        // clone response as it can only be used once and needs to be returned for client fetch
        let responseData = await response.clone().json()
        await responseData.data.forEach(function (todo) {
            localforage.setItem(todo[0], todo[1])
        })

        return response

    }())

但是,当 if 解析为 true(IndexedDB 中的数据)时,我的前端得到一个空的响应对象。就好像我的响应对象是在 IndexedDB promise 解决之前创建的。

最佳答案

在无法运行代码的情况下有点猜测但是

  • 我认为你需要等待 localforage.iterate 因为它返回一个 promise
  • 我认为您还需要等待 localforage.setItem 因为 它也返回一个 promise - 使用 Promise.allmap 应该为你处理它

    var data = {success:true, msg:'', data: []};
    
    await localforage.iterate((value, key) => {
        data.data.push([key, value])
    })
    if (data.data.length > 0) {
        return new Response(JSON.stringify(data),{
            headers: { "Content-Type" : "application/json" }
        });
    }
    
    let response = await fetch(event.request)
    // clone response as it can only be used once and needs to be returned for client fetch
    let responseData = await response.clone().json()
    await Promise.all(responseData.data.map(todo => {
        return localforage.setItem(todo[0], todo[1]);
    }));
    
    return response;
    

关于javascript - 从 service worker 返回带有 JSON 的 Response 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51596725/

相关文章:

javascript - 如何设计带有内部 float 的 div 以水平扩展以允许所有内部 float div 适合?

javascript - LocalForage、图像和 Blob

javascript - 通过 promise 从多个来源获取数据

javascript - 当我尝试缓存 xxx.worker.js 时,Service Worker 不会安装

android - PWA - list 属性 "display": "standalone" not working on Android

javascript - 如何在javascript对象中查找具有相同值的对象属性?

javascript - 获取标签之间的变量并附加到 URL

javascript - 检查数组的所有值是否属于同一类型

javascript - 取消 JavaScript promise

javascript - Service Worker 根据屏幕分辨率缓存不同大小的图像