仅在较早的一组具有 运行 槽后才执行一组新的提取

Execute a new set of fetches only after the earlier set has ran trough

我正在尝试从 API 获取实时摄像头源网页的图像。问题是,对于定时获取请求,最终 API 中的一个响应花费了很长时间,以至于代码错误。该页面有多个摄像头源,它们通过 cameraObjects[] 数组中所有摄像头的循环同时刷新。 image() 函数应响应一个解析,然后将其收集到数组 promises[].

简而言之,当 updateImages() 中循环调用的所有 image() 函数都已 运行 时,我需要 运行 refreshImages() 函数。我才刚开始写代码...

class camera {
    constructor(Uuid,url,username,password) {
        this.Uuid = Uuid;
        this.url = url;
        this.username = username;
        this.password = password;
    }
    image() {

        let uuid = this.Uuid
        let url = this.url
        let username = this.username
        let password = this.password
        let headers = new Headers();
        let authString = `${username}:${password}`; 
        headers.set('Authorization', 'Basic ' + btoa(authString));
        let imageUrl = url + uuid
        fetch(imageUrl,{method: 'GET', headers: headers})
            .then(response => response.blob())
            .then(image => {
                console.log(image);
                var reader = new FileReader();
                reader.readAsDataURL(image);
                reader.onloadend = function() {
                        var base64data = reader.result;                
                        let img = document.getElementById("camera_" + uuid);
                        img.src = base64data;
                        return new Promise(function(resolve) {
                                resolve(promise);
                        })

                }
            })
    }
        
} 
function updateImages() {
    cameraObjects = listOfCameraObjects();
    let promises = [];
    for(let e = 0; e < cameraObjects.length; e++) {
        let promise = new Promise(cameraObjects[e].image())
        promises.push(promise)
    }
    Promise.all(promises)
        .then(() => { 
            refreshImages();
        })
}
function refreshImages() {
    let currentInterval = getInterval();
    refrehInterval = setTimeout(updateImages, currentInterval);
    console.log(refrehInterval)
    
}

Promises 有一些地方你做错了 -

return new Promise(function(resolve) {
    resolve(promise);
})

虽然 return Promise.resolve(promise) 是相同的 - 但在您的代码中,promise 是什么?未在该范围内的任何地方声明 - 同样,作为事件处理程序 (onloadend) 中的最后代码,它毫无意义,因为从事件处理程序返回值是无意义的

let promise = new Promise(cameraObjects[e].image())

这不是你构建承诺的方式......承诺构造函数的参数需要是一个函数,而不是调用函数的结果(除非 returns 一个函数,当然,但它没有)

我建议您或许阅读一些 docs 关于如何构建 Promise 以及如何使用它们的内容

与此同时,我相信这段代码会做你想做的事

class camera {
    constructor(Uuid,url,username,password) {
        this.Uuid = Uuid;
        this.url = url;
        this.username = username;
        this.password = password;
    }
    image() {
        const headers = new Headers();
        const authString = `${this.username}:${this.password}`; 
        headers.set('Authorization', 'Basic ' + btoa(authString));
        const imageUrl = this.url + this.Uuid;
        
        return fetch(imageUrl, {method: 'GET', headers: headers})
        .then(response => response.blob())
        .then(image => new Promise((resolve, reject) {
            const reader = new FileReader();
            reader.readAsDataURL(image);
            reader.addEventListener('loadend', () => {
                const img = document.getElementById("camera_" + uuid);
                img.src = reader.result;
                resolve();
            });
            reader.addEventListener('error', reject);
        }));
    }
        
} 
function updateImages() {
    Promise.all(listOfCameraObjects().map(cam => cam.image()))
    .then(refreshImages);
}
function refreshImages() {
    let currentInterval = getInterval();
    refrehInterval = setTimeout(updateImages, currentInterval);
    console.log(refrehInterval)
}