Решения, которые полагаются исключительно на закрытий будет работать до точки. Они будут последовательно добавлять статьи одного звонка mod.getArticles()
в правильном порядке. Но рассмотрите второй звонок до того, как первый будет полностью удовлетворен. Из-за асинхронизма процесса набор статей второго вызова можно было бы добавить до первого.
Лучшим решением будет гарантировать, что даже быстрый последовательность огневого mod.getArticles()
вызовов будет:
- добавлять статьи каждый вызов в правильном порядке
- Append все наборы статей в правильном порядке
Один из подходов к каждому из них:
- синхронно добавьте контейнер (div) в DOM и сохраните ссылку на него.
- асинхронно заполняет контейнер содержимым, когда оно поступит.
Для этого вам необходимо будет изменить mod.appendArticle()
, чтобы принять второй параметр - ссылку на элемент контейнера.
mod.appendArticle = function(data, $container) {
...
};
Для удобства, вы можете также выбрать, чтобы создать новый метод, mod.appendArticleContainer()
, который создает DIV, присоединяет его к DOM и возвращает ссылку на него.
mod.appendArticleContainer = function() {
//put a container somewhere in the DOM, and return a reference to it.
return $("<div/>").appendTo("wherever");
};
Теперь mod.getArticles()
все еще очень просто:
mod.getArticles = function() {
//Here, .slice() returns a new array containing the required portion of `mod.vars.pushIds`.
//This allows `$.map()` to be used instead of a more cumbersome `for` loop.
var promises = $.map(mod.vars.pushIds.slice(mod.vars.ajaxCount, 3), function(id) {
var $container = mod.appendArticleContainer();//<<< synchronous creation of a container
return $.ajax({
url: '/ajax/article/' + id + '/',
type: "GET",
dataType: 'HTML'
}).then(function(data) {
if (data.length) {
mod.appendArticle(data, $container);//<<< asynchronous insertion of content
} else {
return $.Deferred().reject(new Error("get article ajax output error"));
}
}).then(null, function(e) {
$container.remove();//container will never be filled, so can be removed.
console.error(e);
return $.when(); // mark promise as "handled"
});
});
return $.when.apply(null, promises);
};
mod.getArticles()
теперь возвращает обещание завершения его абонента, что позволяет в дальнейшем сцепление при необходимости.
Ответ не в том же порядке запуска, что ajax - это асинхронный и успешный отпечаток до dom, когда скрипт заканчивается, и сервер устанавливает код успеха. Единственный шанс - связать вызовы ajax в скриптах. [Async: false устарел.] – MTS
Франциско, вы можете добавить 'mod.appendArticle()' к вопросу? –