承诺和完成不工作

时间:2014-06-14 21:04:35

标签: javascript jquery promise

我有一个简单的.append循环迭代100次。最后,我想表示它已完成,并且它没有触发。任何人都可以解释为什么.promise().done()在这里不起作用:

$(document).ready(function(){ 

    var iterate = function(){
        alert("Start!");
        for(var i=1; i<101; i++) {
            $('body').append('Iteration ' + i + '<br>');
        };
    };

    iterate().promise().done(function(){
        $('body').append('Done! <br>');
        alert("Finished!");
    });
});

这不是一个特殊的图书馆。小提琴是here。谢谢!

2 个答案:

答案 0 :(得分:1)

promise用于在绑定到您正在调用promise 的对象的所有操作完成后执行操作。这意味着您不希望在iterate电话的结果上拨打电话;你想在$('body')上调用它:

iterate();
$('body').promise().done(function(){
    $('body').append('Done! <br>');
    alert("Finished!");
});

如果您正在执行异步操作,您会看到更多好处;随着代码的继续,实际上会继续完成的事情,例如动画。

按照目前的情况,你可以这样做:

iterate();
$('body').append('Done! <br>');
alert("Finished!");

这具有相同的效果,因为在第一个示例中,绑定到body的所有操作都已运行。我们在iterate中所做的一切都不是异步的,所以我们没有调用promise,直到所有append次调用已经已经完成

答案 1 :(得分:-2)

您定义的

iterate - 不会返回任何内容,因此在promise()上调用undefined会导致错误

您需要返回$('body');

 var iterate = function(){
        alert("Start!");
        for(var i=1; i<101; i++) {
            $('body').append('Iteration ' + i + '<br>');
        };
       return $('body'); // add this line
    };