由于使用$.Deferred我已经遇到过几次这样的场景:我有一个值列表,每个值都以某种方式产生一个Deferred Object,并且我想在解析所有Deferred对象后执行回调.
一个更具体的例子是这样的:
var urls = [ 'foo.com','bar.com','baz.com','qux.com' ],defers = [],defer; for( var i = 0,j = urls.length; i < j; i++ ){ defer = $.ajax({ url: 'http://' + urls[ i ] }); defers.push(defer); } $.when.apply(window,defers).done(function(){ // Do Something });
解决方法
是的,你永远不应该在循环中引用查找值.总是复制一份.
var urls = [ 'foo.com',defer; var urlsLength = urls.length; for( var i = 0,j = urlsLength; i < j; i++ ){ defer = $.ajax({ url: 'http://' + urls[ i ] }); defers.push(defer); } $.when.apply(window,defers).done(function(){ // Do Something });
但说真的,我只是joshin’你.那段代码摇滚.坚持下去.