我有这段代码:
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方法。在定义的超时延迟之前,某些事情是不正确的。怎么了?有人可以帮忙吗?
答案 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
答案 1 :(得分:0)
为什么不使用$ .when
$.when(function).done(function( x ) {
console.log('test');
});
答案 2 :(得分:0)
你正在使用某种非Jquery,异步(如果你已经拥有jQuery则完全没有必要)函数 - 因为异步操作在一个单独的线程上运行,调用者将立即完成。如果你真的想确保顺序执行,你可以简单地使用一个正确的jQuery UI方法(比如animate:http://api.jquery.com/animate/)并添加一个完整的处理程序,如链接中所述