Параметризованное выполнение deferred
С помощью этих двух методов можно изменить состояние объекта deferred на resolved или rejected ("удачно выполненное" или "ошибки выполнения"). В отличие от похожих .resolve() и .reject(), эти два метода позволяют задать контекст выполнения (значение переменной this) обработчиков, которые будут вызваны в связи с изменением состояния объекта deferred. Замечание: представленные методы, относятся к методам объекта deferred, а не jQuery. Поэтому на объектах jQuery их вызывать не следует (например так: $("div").resolveWith(...)).
Первый метод переводит объект deferred из состояния "не выполнено" в "успешно выполнено", а второй, в состояние "ошибка выполнения".
context — задает значение переменной this в функциях, заданных в роли обработчиков смены состояния объекта deferred.
args — массив параметров, которые будут переданы в соответствующие обработчики. В обработчиках, каждый элемент этого массива будет доступен как отдельный параметр (т.е. args[0] будет первым параметром в обработчике, args[1] — вторым параметром и т.д.).
Замечание 1: если вы имеете дело не с самим объектом deferred, а с его заместителем, то вы не сможете воспользоваться методами resolveWith и rejectWith.
Замечание 2: объект deferred может изменить свое состояние только один раз. Вызов методов resolveWith и rejectWith на объектах, состояние которых отлично от "не выполнено" ни к чему не приведет.
Когда объект deferred переходит в состоянии resolved, происходит вызов всех обработчиков, установленных с помощью done(), then() и always(). Если объект переводят в состояние rejected, то произойдет выполнение всех обработчиков, установленных методами fail(), then() и always().
Пример использования
Выполним объект Deffered, задав в качестве контекста выполнения определенный элемент страницы, и два аргумента:
// создадим объект Deferred. var deff = $.Deferred(); // установим на него обработчик удачного выполнения, // который будет ожидать два параметра deff.done(function(a, b){ alert("Контекст выполнения этой функции, элемент с id = " + this.attr("id") + ", а переданные в нее параметры: a = " + a +" и b = " + b); }); //... какой то код ... deff.resolveWith($("#someEl"), [1, 2]); // в итоге, на экран будет выведено сообщение: // Контекст выполнения этой функции, элемент с id = someEl, // а переданные в нее параметры: a = 1 и b = 2