jQuery推迟并承诺不能正常工作

jQuery deferred and promise not work corectly

本文关键字:工作 常工作 推迟 承诺 不能 jQuery      更新时间:2023-09-26

我有这个代码:

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();

我想发起一些接一个的行动。但我需要舒尔,第一个已经完成了。所以我使用承诺和延迟方法。有些不对劲 bc 第二个操作在定义的超时延迟之前开始。怎么了?有人可以帮忙吗?

链设置不正确?

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

在这里摆弄

为什么不使用 $.when

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

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