2015-01-07 2 views
0

Я пытаюсь задерживать некоторые активы для веб-сайта. Я очень новичок в обещаниях, но они, похоже, очень полезны в этом контексте. В частности, у меня есть метод ниже, который я создал для загрузки как файлов HTML, так и CSS, а затем переверните наблюдаемый элемент KnockoutJS, указав, что секция затем доступна. Этот метод выглядит следующим образом:Руководство по созданию иерархии обещаний jQuery

function delayDownloadAssets(sectionName) { 
var htmlRequest = $.ajax({ url: 'http://www.example.com/' + sectionName + '.html' }), 
cssRequest = $.ajax({ url: 'http://www.example.com/' + sectionName + '.css' }); 

$.when(firstRequest, secondRequest).done(function (firstResponse, secondResponse) { 
    //Insert HTML assets and CSS assets into DOM 
    app.sections[sectionName].enabled(true); 
}); 
} 

я могу вызвать метод несколько раз, как:

delayDownloadAssets("Section1"); 
delayDownloadAssets("Section2"); 
delayDownloadAssets("Section3"); 

До сих пор, так хорошо. Но я хотел бы обернуть все три вызова загрузки загрузки аналогичным образом, чтобы я мог принять меры. Что-то вроде:

$.when(delayDownloadAssetsCall1, delayDownloadAssetsCall2,delayDownloadAssetsCall3).done(function() { 
    alert('Web site download is entirely complete!'); 
}); 

Я надеюсь, что этот вопрос ясен, но если она нуждается в разъяснении, пожалуйста, дайте мне знать. Благодаря!

ответ

4

Он должен работать так, как если бы вы вернули результат $ .when:

function delayDownloadAssets(sectionName) { 
    var htmlRequest = $.ajax({ url: 'http://www.example.com/' + sectionName + '.html' }), 
     cssRequest = $.ajax({ url: 'http://www.example.com/' + sectionName + '.css' }); 

    //add return here 
    return $.when(firstRequest, secondRequest).done(function (firstResponse, secondResponse) { 
     //Insert HTML assets and CSS assets into DOM 
     app.sections[sectionName].enabled(true); 
    }); 
} 
+0

Спасибо! Какое простое решение. Я соглашусь, как только SO разрешит это. – BenjiFB

0

Почему не просто цепь 3 с проделанными функциями.

т. Е. Выполняемая функция первого вызова вызывает вторую и вторую выполняемую функцию, вызывает третью и, наконец, функцию завершения третьего вызова делает все, что вам нужно.

UPDATE:

работать в Paralel вам потребуется код асинхронной.
Сначала создайте глобальную

var doneFlag = 0; 

Я бы тогда называть каждый помощью SetTimeout с проделанной функцией, которая содержит только

doneFlag++; 

Затем четвертую функцию SetTimeout, которая вызывает простой цикл

while(doneFlag != 3) 
{ 
    var x = 5+5; //just to keep from crashing js 
} 
//any code you want to run after complete dl of all. 
+0

Потому что он хочет, чтобы запустить их параллельно. – SLaks

+0

Чтобы эхо SLaks: Это сработает, но, вероятно, запустив параллельные загрузки, они будут работать быстрее. (Или это моя надежда, так или иначе) – BenjiFB

+0

Я не забирал сообщение, чтобы работать параллельно. см. обновление – Buck3y3

1

С delayDownloadAssets написан как указано Esailija, вы можете пойти дальше:

function loadSections(sections) { 
    return $.when.apply(null, sections.map(delayDownloadAssets)); 
} 

вызова следующим образом:

var sections = ["Section1", "Section2", "Section3"]; 

loadSections(sections).then(function() { 
    //Web site download is entirely complete! 
}); 
+0

Можете ли вы помочь мне понять использование «тогда» здесь вместо «сделано»? – BenjiFB

+1

В jQuery отличия заключаются в следующем: (a) .then() принимает два обратных вызова - успех и ошибку, (b) .then() обладает «фильтрующей мощностью» - возвращаемые значения обратных вызовов передаются по цепочке обещаний в виде нового обещания, тогда как выполняется игнорирует любое возвращаемое значение и передает его обещание ввода в точно таком же состоянии. (В обещаниях/реализации A +, .done() имеет совершенно другое значение, чем значение .done()) jQuery. Я склонен не использовать jQuery's .done() - это немного «мятежник без причины». –

Смежные вопросы