在我的代码中使用Promises?使用deferred对象和Jquery

时间:2014-09-26 08:59:02

标签: javascript jquery arrays ember.js promise

您好我使用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();

        }
    },

1 个答案:

答案 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