用于预加载图像的 Queue.js 一直在等待? (打回来)

Posted

技术标签:

【中文标题】用于预加载图像的 Queue.js 一直在等待? (打回来)【英文标题】:Queue.js to preload images is waiting forever? (Callback) 【发布时间】:2013-08-07 12:13:45 【问题描述】:

我正在使用mbostock queue.js script 加载几个 json 文件,方法如下:

var q = queue()
.defer(d3.json, "world-110m.json")
.defer(d3.tsv, "world-country-names.tsv")
.await(ready);

其中 ready 是加载所有内容时要执行的函数。

我想通过添加延迟来预加载图像。这可能吗?我试了好几种方法,都不行。

我认为必须创建一个函数,但我不能让它异步,并且队列一直在等待......

【问题讨论】:

您提到了一些您尝试过的代码。您可以发布其中的一个或多个吗?还解释了为什么将图像集成到 queue.js 与使用一些现有的图像预加载方法的更多背景。 我尝试了类似 .defer(myFunc, "myImg.png");其中 myFunc = function(src)var img = new Image(); img.src = src; img.onload = function()return true; 。和一些变化。代码已执行,但就像我没有向 await() 发送正确的信号 【参考方案1】:

这是 queue.js 对 the callbacks 的期望:

回调遵循 Node.js 约定,其中第一个参数是可选的错误对象,第二个参数是任务的结果。

因此,您的代码的简单版本可能如下所示:

var loadImage = function(src, cb) 
    var img = new Image();
    img.src = src;
    img.onload  = function() cb(null, img); ;
    img.onerror = function() cb('IMAGE ERROR', null); ;
;

queue()
    .defer(d3.json, "data/flare.json")
    .defer(d3.csv, "data/test.csv")
    .defer(loadImage, "img/test.png")
    .await( function(error, jsondata, csvdata, imagedata) 
        if (error)  console.log('error', error);  
        else  console.log('success', jsondata, csvdata, imagedata) 
    );

我不确定您想要返回关于图像的什么(如果有的话),但在上面的示例中 cb(null, img) 我将返回整个对象。

【讨论】:

效果很好,谢谢。关于错误处理,我知道我应该像 cd(error, img) 一样添加它,然后如果 error 不为 null,则更改函数行为。但我不知道如何检测图像是否未加载(例如,如果 url 错误)。我知道我可以添加一个img.onerror,但是onload函数似乎没有得到错误值。 @RogerVeciana 查看上述代码的编辑版本,添加了简单的错误处理。

以上是关于用于预加载图像的 Queue.js 一直在等待? (打回来)的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 用于加载和预加载外部闪存或图像的通用类

用于加载和预加载外部闪存或图像的公共类

Adobe AIR - 带有图像的自定义预加载器

UIImageView 动画预加载

在 Flutter 应用中预加载(所有)图像资源

为 Facebook 的 Android 原生广告预取图像