【发布时间】:2017-07-20 19:23:18
【问题描述】:
var images;
function preloadTrial(actor, event) {
return new Promise(function(res) {
var i = 0;
images = [];
var handler = function(resolve, reject) {
var img = new Image;
var source = '/static/videos/' + actor + '/' + event + '/' + i + '.png';
img.onload = function() {
i++;
resolve(img);
}
img.onerror = function() {
reject()
}
img.src = source;
}
var _catch = function() { res(images) }
var operate = function(value) {
if (value) images.push(value);
new Promise(handler).then(operate).catch(_catch);
}
operate();
})
}
function playSequence(time){
var delta = (time - currentTime) / 1000;
currentFrame += (delta * FPS);
var frameNum = Math.floor(currentFrame);
if (frameNum >= numFramesPlay) {
currentFrame = frameNum = 0;
return;
}else{
requestAnimationFrame(playSequence);
currentImage.src = images[frameNum];
currentTime = time;
console.log("display"+currentImage.src);
}
};
function rightNow() {
if (window['performance'] && window['performance']['now']) {
return window['performance']['now']();
} else {
return +(new Date());
}
};
currentImage = document.getElementById("instructionImage");
// Then use like this
preloadTrial('examples', 'ex1').then(function(value) {
playSequence(currentTime=rightNow());
});
我编写了一个 Javascript 函数,假设加载一个充满编号的 .png 文件的目录。但是,我事先不知道目录中的项目数。所以我做了一个函数,继续存储图像,直到源给我一个错误。但是当我运行代码时,程序甚至没有进入.onload和.onerror函数,导致死循环。
编辑:这是我当前的代码。看起来图像已正确分配并推入数组图像。但是当我尝试将其加载到 img 标签(currentImage.src)并运行 playSequence 时,它不会显示。
【问题讨论】:
-
我认为
/static正在尝试在根 (/) 目录中找到文件夹static。文件结构设置是什么样的?将其更改为./static或static有什么作用吗? -
@J.陈不,那不是问题。它适用于 for 循环。我使用一段时间的唯一原因是因为我不知道图像的数量。
-
摆脱
on。它用于 HTML 而不是脚本。 -
我认为正在发生的事情是图像[i] 不断被写入。我假设 while 循环的运行速度比图像对象加载的速度快;当您执行
images[i].src = source;时,它会尝试加载源代码,但while 循环的迭代速度更快,我们在加载源代码之前点击了images[i] = new Image();。 -
你应该使用一个promise来解决onload并拒绝onerror,然后加载下一个直到你发现错误。
标签: javascript