2017-01-07 23 views
0

複数の要求を送信した後に関数を呼び出そうとしています。 loadEventsFromCalendar関数は、各カレンダーのイベントデータへのアクセス要求を送信し、json_event_listに格納します。 renderTimeline関数はこの大きなリストを取り、それに基づいてビジュアライゼーションを描画します。複数の非同期関数呼び出しの後にjavascript関数を実行する

function loadFromAllCalendars(calendarNames){ 
    var dfd_lst=[]; 
    //Load events from all selected calendars 
    for (var i =0; i<calendarNames.length;i++){ 
     dfd_lst.push(loadEventsFromCalendar(calendarNameIds[calendarNames[i]],calendarNames[i])); 
    } 
    $.when.apply($,dfd_lst).done(renderTimeline); 
} 

    function loadEventsFromCalendar(calendarId,calendarName) { 
    var dfd = $.Deferred(); 
    // Add events from calendar corresponding to the given calendarId into json_event_lst. 
    var request = gapi.client.calendar.events.list({ 
     'calendarId': calendarId, 
     'timeMin': startdate.toISOString(), 
     'showDeleted': false, 
     'singleEvents': true, 
     'maxResults': 50, 
     'orderBy': 'startTime' 
    }); 
    request.execute(function(resp) { 
     ....data processing of json_event... 
     json_event_lst.push(json_event) 
     dfd.resolve(); 
     return dfd.promise() 
    }); 
    } 

私は約束が満たされているかどうかを確認するためにjqueryの繰延オブジェクトを使用して試してみましたが、データアレイが読み込まれる前にrenderTimeline機能がまだ呼び出されます。

+0

はrenderTimeline'パラメータが渡されることを期待し 'ていますか? – guest271314

答えて

0

いくつかの約束が解決するまで待つことを約束してください。all()リクエストは(関数内すなわちノーリターン)を実行しないされなかった場合でも、未定義の値はその後、何とか.doneが取得する可能dfd_lst、に格納されているので

Promise.all([promise1, promise2, promise2]); 
0

繰延オブジェクトのメソッドは、かなりの仕事をしませんでした実行される。私はレンダリングするかどうかを指定するには、loadEventsFromCalendarに追加BooleanパラメータrenderVisを追加することによってこの問題を解決することになった:

function loadEventsFromCalendar(calendarId,calendarName,renderVis=false) { 
    // Add events from calendar corresponding to the given calendarId into json_event_lst. 
    var request = gapi.client.calendar.events.list({ 
     'calendarId': calendarId, 
     'timeMin': startdate.toISOString(), 
     'showDeleted': false, 
     'singleEvents': true, 
     'maxResults': 50, 
     'orderBy': 'startTime' 
    }); 

    request.execute(function(resp){ 
     .... 
     .... 
     if (renderVis){ 
      renderTimeline(); 
     } 
    } 
} 
+0

解決策は '$ .when()'、 '$ .Deferred()'、 'deferred.done()'を使用しないことでしたか? – guest271314

+0

はい、ブールパラメータは、遅延オブジェクトの使用を必要としない回避策でした。 – ROBOTPWNS

+0

Questionが '$ .when()'、 '$ .Deferred()'が使用されている実際の 'javascript'にはどのように回答しますか? – guest271314

関連する問題