Javascript 从服务工作者返回带有JSON的响应对象

Javascript 从服务工作者返回带有JSON的响应对象,javascript,promise,service-worker,indexeddb,web-worker,Javascript,Promise,Service Worker,Indexeddb,Web Worker,我试图钩住获取JSON的请求,并检查数据是否在IndexedDB中,以便在进入网络之前获取它。我想,我的承诺没有兑现,有些奇怪的事情正在发生 这是我的密码: event.respondWith(async function() { var data = {success:true, msg:'', data: []}; localforage.iterate(function(value, key) { data.data.push([k

我试图钩住获取JSON的请求,并检查数据是否在IndexedDB中,以便在进入网络之前获取它。我想,我的承诺没有兑现,有些奇怪的事情正在发生

这是我的密码:

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承诺解决之前创建的。

这只是一个猜测,无法运行代码,但是

  • 我认为您需要等待
    localfollow.iterate
    ,因为它返回一个 允诺
  • 我认为您还需要等待
    localfough.setItem
    自 它还返回一个承诺-使用
    promise。所有
    map
    都应该为您处理这个问题

    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;
    

localfound
??