Вы знаете, в другом 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.
Возможно использование. Always() для newPromise.resolve()? (Мне действительно нужно возиться с этим материалом больше.) – Dave
Точка решения состоит в том, чтобы разрешить текущее обещание в цепочке обещаний (что вы всегда будете хотеть решить, будет ли обещание ajax/ajax успешным (разрешено) или не удается (отклоняется). Но вы действительно придумали хороший момент. Вместо того, чтобы требовать разрешения обещания после вашего кода «завершить/сбой», вы можете поместить его в свой «всегда» вызов и далее выделить эту проблему. – JayC
Если вы имеете в виду цепочку с всегда, как, например, при замене вызова 'pipe' на' always' ... ну, я думаю, что проблема всегда всегда возвращает обещание orignal, тогда как pipe всегда возвращает новый. но я ошибаюсь. – JayC