Ответ 1
Ничего себе... это было упражнение - $. Отложенное() было немного трудно уловить мой разум, но я все это работал так, как хотел! Я не знаю, как это упростило - возможно, другие могут сделать его более эффективным.
Суть его в том, чтобы создать цепочку отложенных слов с помощью .pipe().
EDIT: Мой код (ниже) не вмещает менее 2 объектов в список ссылочных ключей. Я обновил jsfiddle для работы с ключевыми списками любого размера.
Вы можете увидеть все следующие работы JSFiddle здесь: http://jsfiddle.net/hBAsp/3/
Вот шаг за шагом, как я его решил:
-
Начните с объекта, полного функций и массива ссылочных ключей (в том порядке, в котором вы их обрабатывали). Функции должны ожидать получения отложенного объекта для разрешения при завершении:
var obj = { one: function(dfd){ /* do stuff */ dfd.resolve(); }, two: function(dfd){...}, three: function(dfd){...}, etc... }; var keys=['one','two','three', etc...];`
-
Создайте основную отложенную оболочку, передающую обещание в функцию инициализации. Мы добавим код в функцию, когда мы идем:
var mainDeferred = $.Deferred(function(mainDFD){
-
Внутри этой функции инициализации создайте массив отложенных событий, вручную создав первый отложенный объект:
var dfds = [$.Deferred()];
-
Далее, используйте цикл for, чтобы пройти через второй через следующие пункты в нашем списке ключей. Мы будем:
- создание отложенного объекта для каждого элемента, который мы выполняем
- настройка анонимной функции, которая будет запускать связанную с ключом функцию из нашего obj, передавая ее для разрешения нашего недавно созданного объекта Отложенные
- создание новой созданной функции на ранее созданном объекте "Отложенный" (поэтому мы должны были создать первый вручную).
-
Вы должны использовать замкнутый цикл в списке для того, чтобы преодолеть проблемы, связанные с JavaScript.
for (i=1; i<keys.length-1; i++){ (function(n){ dfds.push($.Deferred()); dfds[i-1].pipe(function(){ obj[keys[n]].call(this,dfds[n]); }); })(n); };
-
Вручную создайте последнюю анонимную функцию и переместите ее на следующий отложенный объект в нашем списке. Мы делаем это вручную, потому что хотим передать ему главный отложенный объект для разрешения, чтобы весь shebang выстрелил как можно скорее, как только завершился последний процесс:
dfds[keys.length-2].pipe(function(){ obj[keys[keys.length-1]].call(this,mainDFD); });
-
Теперь, когда весь наш конвейер построен, все, что нам нужно сделать, - это отключить первый объект и назначить ему первый отложенный для разрешения:
obj[keys[0]].call(this,dfds[0]);
-
Просто закройте нашу основную функцию отсроченной инициализации (все это будет срабатывать, как только будет создано отложенное:
});
-
Теперь мы также можем подключить функцию к основному объекту, который будет запущен после запуска всех предыдущих элементов:
mainDeferred.pipe(function(){ /* do other stuff */ });