이렇게 많은 문제를 해결하고 벽에 머리를 두드리는 중입니다. 대부분의 경우, 나는 약속들과 그것들이 어떻게 작동 하는지를 잘 알고 있으며, 몇 가지 프로젝트에서 그것들을 사용했다. Google 캘린더 API에서 다른 캘린더 데이터를 여러 번 호출하고 스크립트가 콜백 함수에 사용할 결과 배열의 길이를 계산할 때 내 약속을 모두 지키는 데 약간의 문제가 있습니다. 내가 완료해야 약속의 배열을 기다리고로 jQuery가 지연된 약속으로 예상대로 작동하지 않을 때
(function($){
var baseUrl = 'https://www.googleapis.com/calendar/v3/calendars/',
apiKey = 'xxxxxxxxxxxx',
calendarData = [],
events = [],
allCalendars = [],
eventsToDisplay = 9;
/* Get all the calendars that we have registered */
function getCalendars() {
return $.getJSON(ajaxurl, {action: 'wps_get_calendars'});
}
/* Get the events for a calendar by the calendar ID */
function getCalendarEvents(calendarID) {
return $.getJSON(baseUrl + calendarID + '/events', {
maxResults: '4',
orderBy: 'startTime',
timeMin: moment().format(),
singleEvents: true,
key: apiKey
}).success(function(data){
calendarData.push(data.items);
});
/* Create a collection of promises */
var promises = getCalendars().then(function(calendars){
var deferreds = [];
calendars.forEach(function(calendar){
deferreds.push(
getCalendarEvents(calendar.googleCalendarId)
);
});
return deferreds;
});
/* Wait until all the promises have completed, then sort the events */
$.when.apply($, promises).then(concatEvents);
})(jQuery);
은 기본적으로 문제가
$.when
에 매우 마지막 호출에있다 : 여기에 관련 코드입니다.
$.when
은
$.when
콜백의 콘솔에
calendarData
배열을 기록하려고하면 계산 된 길이가없는 배열을 반환하기 때문에 작동하지 않는 것 같습니다. 이 작업을 수행하는 방법을 파악할 수있는 유일한 방법은 콜백에
setTimeout
을 사용하고 약 2000 밀리 초로 설정하는 것입니다.하지만 네트워크 연결, API 가용성 등에 따라 이상적이지 않습니다. 모든 데이터를 수신 할 시간은 완전히 다를 수 있습니다.
$.when
콜백에 결과를 로깅하려고하면 콘솔에서 볼 수있는 아이디어와 마찬가지로 스크립트가 보이기 때문에 반복 할 수 없습니다. 비어 생각합니다 :
어떤 생각을 내가 잘못 여기서 뭘하는지? 모든 도움을 미리 감사드립니다.
1) deferred.then는 반환 된 배열이 아니라 새로운 약속을 반환합니다. 2) getcalendars가 해결 될 때까지는 배열에 액세스 할 수 없습니다. 3) .then의 범위 밖에서 약속 배열을 만들고 getcalendars.then을 사용하여 그것을 채 웁니다. getcalendars에서 해결할 다른 외부 지연을 사용하십시오. 최종 약속이 배열로 푸시 된 다음 배열을 사용하여 .apply를 수행합니다. –
'$ .when()'은 실제로 뇌사 상태입니다. jQuery Ajax가 호출된다. 배열로 해석되지 않습니다. N 개의 개별 인수로 해석되며 각 인수는 배열 일 수 있습니다. 임의의 수의 결과를 처리하려면'$ .when (...), then (fn)'에'fn'에 전달 된'arguments' 객체를 처리해야합니다. jQuery 문서에서'$ .when()'예제를 공부하십시오. 특히 Ajax 호출과 함께 사용할 때 더욱 그렇습니다. – jfriend00