2012-04-06 2 views
0

У меня есть страница, отображающая списки объектов. Каждый из этих списков происходит от вызова ajax. Как я могу убедиться, что они отображаются последовательно?jQuery последовательно отображает элементы, полученные из запросов ajax

Ive попытался использовать технику, показанную here, но если один из запросов не удался, он отвергает оставшиеся. Мои данные не зависят от предыдущего, так как я могу изменить пример и обработать ошибки?

ответ

2

Вы знаете, в другом post, я написал этот маленький класс резольвера, но мне нравится эта идея трубопровода. Я не знаю, что мне так нравится пример, но с небольшой настройкой я думаю, что все будет хорошо. Признаюсь, мне еще предстоит проверить это.

var urls = ["path1","path2","path3"]; // Output from string.split() 
var chain = $.Deferred(); // Create the root of the chain. 
var promise = chain; // Placeholder for the promise 

// Build the chain 
jQuery.each(urls,function(index,elem){ 
    // Pipe the response to the "next" function 
    promise = promise.pipe(function(response) 
    { 
     var myurl = elem; // Get the current part 
     var newPromise = $.Deferred(); 
     $.ajax 
     ({ 
      type: "GET", 
      url: myurl 
     }).done(function(data){ 
      //these are your normal ajax success function params, IIRC 
      //do stuff with response 
     }).fail(function(){ 
      //oops, it failed, oh well 
      //do stuff on failure 
     }).always(function() { 
      //but always resolve the sequencing promise 
      newPromise.resolve();    
     }); 
     return newPromise; 
    }) 
}); 

chain.resolve(); 

EDIT: вот JSFiddle с имитацией Ajax просит http://jsfiddle.net/jfcox/gFLhK/. Как вы можете видеть, все последовательности.

EDIT II: небольшие изменения в комментариях. обратите внимание, что вы должны быть в состоянии передать информацию в свое следующее обещание, передав все, что угодно, к вашим вызовам разрешения ...

EDIT III: модифицировано по предложению Дейва. Чтобы разделить проблемы, вы можете использовать always по запросу ajax.

+0

Возможно использование. Always() для newPromise.resolve()? (Мне действительно нужно возиться с этим материалом больше.) – Dave

+0

Точка решения состоит в том, чтобы разрешить текущее обещание в цепочке обещаний (что вы всегда будете хотеть решить, будет ли обещание ajax/ajax успешным (разрешено) или не удается (отклоняется). Но вы действительно придумали хороший момент. Вместо того, чтобы требовать разрешения обещания после вашего кода «завершить/сбой», вы можете поместить его в свой «всегда» вызов и далее выделить эту проблему. – JayC

+0

Если вы имеете в виду цепочку с всегда, как, например, при замене вызова 'pipe' на' always' ... ну, я думаю, что проблема всегда всегда возвращает обещание orignal, тогда как pipe всегда возвращает новый. но я ошибаюсь. – JayC

0

Вы можете сохранить список ответов в массиве

function response() { 
    responseArray[i] = response; // Where i is the sequence number of request and response; 
    responseHandler(); // Ping some function which can take the response in the order and process it. 
} 
+0

Я полностью не понял ваш ответ, поэтому, пожалуйста, исправьте меня, если я ошибаюсь, но в этом случае я не буду ждать завершения всех запросов до их рендеринга? – zsquare

+0

нет, как только вы получили ответ responseHandler() функция будет называться, что функция будет анализировать данные. –

+0

Я не думаю, что это отвечает на вопрос ОП. Ответы Ajax могут выходить из строя их запросов. – JayC

0

Вы пытались использовать jQuery.when?
http://api.jquery.com/jQuery.when/

Пример
http://jsfiddle.net/94PGy/4/

В многосекционных Deferreds случае, когда один из Deferreds отвергается, jQuery.when немедленно срабатывает в failCallbacks для своего хозяина будущих периодов. Обратите внимание, что некоторые из Отсрочек могут все еще оставаться нерешенными в этот момент. Если вам необходимо выполнить дополнительную обработку для этого случая, например, отменить любые незавершенные запросы ajax, вы можете сохранить ссылки на лежащие в основе объекты jqXHR в закрытии и проверить/отменить их в failCallback.