首页 > 解决方案 > Javascript 服务工作者仅在文件存在于对象中时获取

问题描述

我知道这不是最佳做法,但我想这样做。我想等待一个文件,直到它存在于一个对象中,这是我的代码:

self.addEventListener('fetch', event => {
    event.respondWith(loadFile(event.request.url))
})
async function loadFile (url) {
    const name = fileName(url)
    if (localCache[name]) {
        return new Response(localCache[name])
    }
}

这里的问题是当文件不存在时,localCache我收到一个失败的请求,并且它一直请求相同的文件直到它存在于 中localCache,每次失败时它都会显示失败请求。我想做的是这样的:

async function loadFile (url) {
    const name = fileName(url)
    let refreshId = setInterval(function() {
        if (localCache[name]) {
            return new Response(localCache[name])
            clearInterval(refreshId);
        }
    }, 3000);
}  

我不想显示该错误并继续调用同一个文件,而是想调用该函数一次并每 3 秒循环一次,直到添加该文件localCache然后返回它。还有其他代码可以将文件添加到localCache. 但有时将所有文件添加到localCache.

标签: javascript

解决方案


你可以尝试这样的事情:

async function loadFile (url) {
    const name = fileName(url)

    return new Promise((resolve, reject) => {
        let refreshId = setInterval(function() {
            if (localCache[name]) {
                resolve(new Response(localCache[name]));
                clearInterval(refreshId);
            }
        }, 3000);
    });
}

或使用等待:

async function sleep(time) {
    return new Promise(resolve => setTimeout(resolve, time));
}

async function loadFile (url) {
    const name = fileName(url)

    while (!localCache[name]) {
        await sleep(3000);
    }

    return new Response(localCache[name]);
}

推荐阅读