Я все время ударил головой в стену, потому что я не могу заставить следующий код работать. Я пытаюсь закодировать фотогалерею с помощью flickrApi и иметь проблемы с несколькими асинхронными вызовами. Но, возможно, есть более чистое решение, чтобы закодировать это.flickrapi (js) несколько асинхронных вызовов в цикле
openPhotoset() вызывается при нажатии ссылки на фотосет. К сожалению, для получения описания фотографии мне нужно использовать другой метод, что означает другой асинхронный вызов. Я перебираю данные, но потому, что я делаю вызов в цикле (это когда у меня есть доступный идентификатор фото), отложенная функция openPhotoset() не решает после цикла, но раньше. Я читал и видел примеры $ .when(), используемые в цикле, заполняя массив отсрочками и проверяя с помощью $ .when, но я, похоже, ужасно терпеть неудачу. Это решение, в котором я нуждаюсь, или есть еще один путь к спасению? ;)
Я хочу выполнить различные функции после того, как все вызовы в openPhotoset() завершены.
function openPhotoset(photosetId) {
var currentPhotoset = [],
deferred = $.Deferred();
_requestPhotosOfSet(photosetId).done(function(data){
$(data.photoset.photo).each(function(i, photo){
var objPhoto = {};
objPhoto.id = photo.id;
objPhoto.title = photo.title;
objPhoto.farm = photo.farm;
objPhoto.server = photo.server;
objPhoto.secret = photo.secret;
// get photo description
requestPhotoInfo(photo.id).done(function(data) {
objPhoto.description = data.photo.description._content;
currentPhotoset.push(objPhoto);
}).then(function() {
// TODO: renders with each iteration, shouldnt!
var template = $('#li-gallery').html(),
result = Mustache.render(template, {currentPhotoset:currentPhotoset});
showGallery();
_$fyGallery.find('.gallery-list').html(result);
deferred.resolve();
});
});
});
return deferred;
}
спасибо за ответ @ Roamer-1888 Я действительно искал это. Спасибо, что показал мне другой способ приблизиться к этому. Мне все еще трудно понять значение $ .when.apply (null, promises), так как я не уверен, что требуется .apply (null, promises). Мое предположение - это массив обещаний, которые $ .when могут прокручивать и возвращать обещание «мастера»? Кроме того, почему нулевой параметр? Я прочитал в приложении (javascriptissexy.com, но, похоже, не понял его.) – flowen
Flowen, '.apply()' '.call()' и '.bind()' связаны с методами js Function. Все три принимают «контекст» в качестве своего первого параметра - то есть объект, который будет использоваться как «это» в целевой функции.Если у целевой функции нет 'this' (в ее непосредственной области), тогда контекст не требуется, но первый слот параметра все равно должен быть занят, поэтому вы можете передать 'null'. У jQuery '$ .when()' есть слабость в том, что он принимает только обычные параметры, разделенные запятыми, тогда как во многих случаях мы хотели бы передать массив. Выполняя '$ .when.apply (null, array)', мы преодолеваем это ограничение. –
Я добавил раздел, чтобы попытаться объяснить шаблон, используемый в ответе. –