jQuery:从函数中包含的$.Deferred中获取解析

jQuery:从函数中包含的$.Deferred中获取解析,jquery,deferred,Jquery,Deferred,如果我在一个函数中有一个带有多个链式承诺的$.Deferred,并且我调用了这个函数,我怎么知道这个Deferred何时得到了解决?例如: jQuery(函数($){ var$div=$('hello world')。appendTo('body'); var test=(函数(){ var dfd=新的$.Deferred(); 然后(函数(){ return$div.animate({width:300},5000,'swing',function(){return$div.append('

如果我在一个函数中有一个带有多个链式承诺的$.Deferred,并且我调用了这个函数,我怎么知道这个Deferred何时得到了解决?例如:

jQuery(函数($){
var$div=$('hello world')。appendTo('body');
var test=(函数(){
var dfd=新的$.Deferred();
然后(函数(){
return$div.animate({width:300},5000,'swing',function(){return$div.append('
第1行');}); }) .然后(函数(){ 返回$div.append(“
第2行”); }); 返回dfd.resolve(); }); $.when(test()).then(function()){ $div.append(“
第3行”); }); });
当我运行该代码时,我有以下内容:

你好,世界
第3行
第1行
第2行

我所期望的是,在我的函数返回的延迟问题解决后,将显示«第3行»。我试图在函数中只返回dfd和调用test().resolve(),但它也不起作用


提前感谢

首先创建一个延迟对象,然后返回该延迟对象的承诺,稍后,在某个异步方法完成后,解析该承诺,如下所示:

jQuery(function($){
    var $div = $('div');

    var test = (function(){
        var dfd = new $.Deferred();
        $div.animate({width:300}, 5000, 'swing', function(){
            dfd.resolve(); //line 3 will printed now, i.e. before line 1
            $div.append('<br>line 1'); //line 1 will be printed after the promise has been resolved
        });
        return dfd.promise();
    });

    $.when(test()).then(function(){
        $div.append('<br>line 3');
    });
});

您知道append不是异步的,animate有自己的回调,所以这真的太复杂了?Takk@adeneo!我会选择你的第一个答案,是的,append是同步的,但它只是为了测试目的。@rgandoin-我认为它只是为了测试,而这种延迟的东西有时可能有点难以理解。
jQuery(function($){
    var $div = $('div');

    var test = (function(){
        var dfd = new $.Deferred();
        $div.animate({width:300}, 5000, 'swing', function(){
            dfd.resolve(); //line 3 will printed now, i.e. before line 1
            $div.append('<br>line 1'); //line 1 will be printed after the promise has been resolved
        });
        return dfd.promise();
    });

    $.when(test()).then(function(){
        $div.append('<br>line 3');
    });
});
jQuery(function($){
    var $div = $('div');

    var test = function(elem, callback){
        elem.animate({width:300}, 5000, 'swing', function(){
            callback();
        });
    };

    test($div, function() {
        $div.append('<br>line 1');
        $div.append('<br>line 2');
        $div.append('<br>line 3');
    });
});