您好我使用Jquery和ember删除某些元素,我想使用Deferred对象来停止代码,然后必须执行下一个语句
这里KillMany是函数,一旦调用它就会执行array.forEach(tryKill); 声明 包含elemets数组[每次回调调用从服务器删除每个元素时,数组内部包含100个元素]
这里我想在完成[删除元素]之后执行我的代码myFinalblock回调必须是calle
请指导我
killMany: function(c) {
var t = this
, wait = []
, dfd = new $.Deferred();
function keep(tile) {
tile.setProperties({ isSelected: false, isHidden: false });
}
function destroy(tile) {
if (t.get('reports')) {
t.get('reports').removeObject(tile.entity);
}
tile.remove.bind(tile);
}
function tryKill(tile) {
tile.set('isHidden', true);
tile.get('entity').kill()
.then(destroy.bind(null, tile),
keep.bind(null, tile));
}
function myFinalblock(){
this.set('selectedTiles', []);
}
this.set('promptDestroyMany', false);
if (c.response) {
var array = this.get('selectedTiles');
array.forEach(tryKill);
myFinalblock();
}
},
答案 0 :(得分:0)
你好像错过了一点承诺。他们不会“停止”您的代码。它们允许您干净地路由代码的异步功能。因此,在调用tryKill
之前,您需要等待所有myFinalBlock
调用完成的方法。为此,首先需要修改tryKill
函数以返回其承诺:
function tryKill(tile) {
tile.set('isHidden', true);
return tile.get('entity')
.kill()
.then(destroy.bind(null, tile),
keep.bind(null, tile));
}
然后你可以这样做:
var tiles = this.get('selectedTiles');
$.when.apply($, tiles.map(tryKill))
.then(myFinalBlock)
.done();
另外,我建议查看一个正确的promise库,而不是使用jQuery的内置延迟,they are known to have a number of problems。