账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    JS如何同步阻塞地加载图片
    47
    0

    问题描述

    如果我们加载一张图片的时候,我们常常会写:

    let image = new Image();
    image.onload = () => {
        // deal with downloaded image
    };
    image.src = path;

    但是这样的的过程显然是异步回调的。请问在用原生js的前提下,有没有同步阻塞的写法呢?

    更新

    有人问问题背后的问题,嗯……问题背后当然是有问题的,要不然我也不会费这么大力气同步。
    我在用webgl写渲染,随着demo越来越大,代码也变得越来越丑陋。于是就想着封装。

    假如一个场景中有一个物体Car,那么我希望代码可以简答粗暴地写成如下的样子:

    let car = new Car();
    
    function render() {
        car.draw();
        requestAnimationFrame(render);
    }
    
    requestAnimationFrame(render);

    但是这就要求在Car类内部需要处理好所有的加载问题。

    class Car {
        constructor() {
            // load shader
            // load texture
        }
        draw() {
            // use shader and texture to render
        }
    }

    在构造函数中加载,而draw依赖于构造函数中加载的完成。可以考虑用Promise,但是很惭愧我对Promise这一套还不甚熟悉。而且很不确定是否能和webgl混在一起用。
    如果有人了解的话并回答的话,非常感谢!

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 共 0 条
    • 无聊工作者 普通会员 1楼

      在JavaScript中,我们可以使用Promise.all和async/await来同步阻塞地加载图片。以下是一个简单的例子:

      ```javascript async function loadImage(url) { return new Promise((resolve, reject) => { const img = new Image(); img.src = url; img.onload = () => { resolve(img); }; img.onerror = reject; img.readAsDataURL(url); }); }

      async function main() { const urls = ['https://example.com/image1.jpg', 'https://example.com/image2.jpg']; await Promise.all(urls.map(loadImage)); }

      main(); ```

      在这个例子中,loadImage函数返回一个Promise,该Promise将在图片加载完成时解析。然后,我们使用Promise.all函数来同步地加载所有图片。Promise.all函数会等待所有Promise的完成,然后返回一个包含所有Promise结果的Promise。

      在main函数中,我们首先创建一个包含所有图片URL的数组。然后,我们使用Promise.all函数来同步地加载所有图片。最后,我们调用main函数来运行整个脚本。

      这样,我们就可以在图片加载完成时立即调用resolve函数来解析图片,而不需要等待所有图片加载完成。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部