I'm trying to make my library work in jQuery 3.0 and it don't work because of breaking changes in Deferred objects, I have code like this:
function ready(defer) {
return function(fun) {
if (defer.state() !== 'resolved') {
defer.then(fun).fail(function(e) {
self.error(e);
});
} else {
fun.call(fun);
}
};
}
and I have two methods pause and resume
pause: function(visible) {
if (self.id() == 4) {
console.log('pause call');
}
cmd_ready(function ready() {
onPause();
paused = true;
if (self.id() == 4) {
console.log('pause', paused);
}
command_line.disable();
if (!visible) {
command_line.hidden();
}
if ($.isFunction(settings.onPause)) {
settings.onPause.call(self);
}
});
return self;
},
resume: function() {
if (self.id() == 4) {
console.log('resume call');
}
cmd_ready(function ready() {
paused = false;
if (self.id() == 4) {
console.log('resume', paused);
}
if (terminals.front() === self) {
command_line.enable();
} else {
if (self.id() == 4) {
console.log('not front');
}
}
command_line.visible();
var original = delayed_commands;
delayed_commands = [];
for (var i = 0; i < original.length; ++i) {
self.exec.apply(self, original[i]);
}
self.trigger('resume');
var fn = resume_callbacks.shift();
if (fn) {
fn();
}
scroll_to_bottom();
if ($.isFunction(settings.onResume)) {
settings.onResume.call(self);
}
});
return self;
},
The deferred is needed because I'm executing pause before command_line object is created.
and I call resolve after first pause:
if (self.id() == 4) {
console.log('resolve');
}
command_defer.resolve();
and the order of logs like this:
pause call
resolve
resume call
resume false
resume call
resume false
pause true
the order should look like this:
pause call
resolve
pause true
resume call
resume false
resume call
resume false
why pause then callback is called long after resolve is called? it was working in jQuery 2.