2013-02-26 46 views
1

我正在开发一个闪存卡网页,并且我想知道预加载的图像何时加载或遇到错误。一旦我掌握了每张图片的状态,我会采取一些行动。当使用延迟解析()和when()时传递参数

我基础上的计算器后Wait for image to be loaded before going on

function loadSprite(src) { 
    var deferred = $.Deferred(); 
    var sprite = new Image(); 
    sprite.onload = function() { 
     deferred.resolve(); 
    }; 
    sprite.src = src; 
    return deferred.promise(); 
} 

我的代码和功能加载精灵

var loaders = []; 
loaders.push(loadSprite('1.png')); 
loaders.push(loadSprite('2.png')); 
loaders.push(loadSprite('3.png')); 
$.when.apply(null, loaders).done(function() { 
// callback when everything was loaded 
}); 

我已经修改了loadSprite决心返回状态的结果:

deferred.resolve("STATUS RESULT"); 

$.when.apply(null, loaders).done(function("STATUS RESULT") { 
    // callback when everything was loaded 
    //Do something with "STATUS RESULT" 
}); 

的问题是,我不能分离出“状态结果”为loaders.push(loadSprite(file to load));每个呼叫也就是说我只得到一个变量回不是一个为loadSprite

每个呼叫我没想到我的上述代码去工作,这更多的是向我自己证明我可以回传。

我无法解决这个问题,感谢所有的帮助。谢谢,

回答

1

其实,它按预期工作。你可以调整你的创作者方法有点像

function loadSprite(src) { 
    return $.Deferred(function(promise) { 
     var sprite = new Image(); 

     sprite.onload = promise.resolve.bind(null, "status result"); 
     sprite.src = src; 
    }).promise(); 
} 

现在,当你把一些承诺对象到一个数组中,并在该

loaders.push(loadSprite('1.png')); 
loaders.push(loadSprite('2.png')); 
loaders.push(loadSprite('3.png')); 

status result适用.when(),将上市参数对象来自.done()处理程序。所以

$.when.apply(null, loaders).done(function() { 
    console.log(arguments[ 0 ]); // status result 
    console.log(arguments[ 1 ]); // status result 
    // etc 
}); 

另外,请记住,.when().done handler,将只有火,如果所有承诺的对象,其中解决成功。这反过来意味着,如果你的某张图片由于某种原因无法加载,它的承诺永远不会达到resolved状态,因此,你的.when()处理程序永远不会触发。

+0

谢谢jAndy。正如您所描述的,当图像预加载时,我的互联网连接中断时,我遇到了错误情况。如何使用(在一个functon中有两个解决方案有问题)取1为没有​​错误,0代表错误和代码:'sprite.onload = promise.resolve.bind(null,1);'''sprite .onerror = promise.resolve.bind(null,0);'然后我将逐个文件地处理结果。再次谢谢你。 – user1558796 2013-02-26 12:39:42

+0

@ user1558796:是的,你当然可以这样做。如果你想*手动*处理这些加载状态的结果。另一方面,您也可以在'.when()'调用中调用'.fail()'来捕获错误。但是这样做,在出现错误的情况下,它仍然不会执行'.done()'处理程序。所以'它可能是一个好主意。解决()'承诺的方式,并通过不同的状态。 – jAndy 2013-02-26 12:49:36

+0

谢谢jAndy。只是现在才回复你的道歉,我刚刚第一次有机会使用你的解决方案。如果我使用'sprite.onload = promise.resolve.bind(null,1);'返回1成功,当我'console.log(参数[..]);'我得到** 1,[对象事件] **。我需要做些什么来删除_,[对象事件] _以便我可以使用数字响应?非常感谢您的协助 – user1558796 2013-03-03 13:02:10