jQuery延迟并承诺无法正常工作

时间:2014-11-28 15:40:27

标签: javascript jquery promise jquery-deferred

我有这段代码:

var d = $.Deferred();
var promise = d.promise();
//
promise = promise.then(function(){
    var t = new $.Deferred();
    var cont = $('.cont').find('> div');
    requirejs(["transit"], function(){
        cont.transit({opacity: .4});
        //
        setTimeout(function(){
            cont.remove();
            return t.promise();
        }, 500);
    });
});
//
promise.then(function() {
    console.log('test');
});
//
d.resolve();

我想要接连发起一些行动。但我需要保证第一个完成。所以我使用promise和deferred方法。在定义的超时延迟之前,某些事情是不正确的。怎么了?有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

链没有正确设置?

t承诺尚未返回d链。

修改后的代码

var d = $.Deferred();
var promise = d.promise();
//
promise = promise.then(function(){
    var t = new $.Deferred();
    console.log('1st promise callback');
    //var cont = $('.cont').find('> div');
    setTimeout(function(){
    //requirejs(["transit"], function(){
        //cont.transit({opacity: .4});
        //
        console.log('timeout 1 func');

        setTimeout(function(){
            console.log('timeout 2 func');
            //cont.remove();
            t.resolve(true);
        }, 10);
    },30);

    return t.promise();
});
//
promise.then(function() {
    console.log('test');
});
//
d.resolve();

输出

1st promise callback (index):27
timeout 1 func (index):33
timeout 2 func (index):36
test

小提琴here

答案 1 :(得分:0)

为什么不使用$ .when

$.when(function).done(function( x ) {
   console.log('test');
 });

答案 2 :(得分:0)

你正在使用某种非Jquery,异步(如果你已经拥有jQuery则完全没有必要)函数 - 因为异步操作在一个单独的线程上运行,调用者将立即完成。如果你真的想确保顺序执行,你可以简单地使用一个正确的jQuery UI方法(比如animate:http://api.jquery.com/animate/)并添加一个完整的处理程序,如链接中所述