Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当对象中存在该文件时,Javascript服务工作者才会获取该文件_Javascript - Fatal编程技术网

仅当对象中存在该文件时,Javascript服务工作者才会获取该文件

仅当对象中存在该文件时,Javascript服务工作者才会获取该文件,javascript,Javascript,我知道这不是最好的做法,但我想这样做。 我想等待文件存在于对象中,这是我的代码: self.addEventListener('fetch', event => { event.respondWith(loadFile(event.request.url)) }) async function loadFile (url) { const name = fileName(url) if (localCache[name]) { return new

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

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);
}  
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);
    });
}
我不想显示错误并继续调用同一个文件,而是想调用该函数一次,并保持每3秒循环一次,直到文件添加到
localCache
中,然后返回它。
还有其他代码将文件添加到
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);
}  
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]);
}