Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p><code>WL.api()</code> is asynchronous, so execution continues on to the next function. </p> <p>You can each function return deferred objects:</p> <pre><code>getCompanyFolders().done(function() { showReportsHTML(); }); function getCompanyFolders() { var getCompanyDeferred = $.Deferred(); WL.api({ path: "/me/skydrive/shared", method: "GET" }).then(function(response) { var deferreds = [] foreach(item in response) { deferreds.push(getReportFolders()); } $.when.apply($, deferreds).done(function() { getCompanyDeferred.resolve(); }); }); return getCompanyDeferred.promise(); } </code></pre> <p>This is obviously a simplified example. The structure of <code>getReportFolders</code> and <code>getReports</code> would look very similar. Let me know if you need me to take the example further.</p> <p><strong>Edit in response to your update</strong></p> <p>A couple things still. First,</p> <p><code>getCompanyFolders();</code> should be:</p> <pre><code>getCompanyFolders().done(function() { showReportsHTML(); }); </code></pre> <p>Second, <code>$.when()</code> accepts <code>deferred</code> or <code>promise</code> objects, which in your case is the return value from your functions.</p> <p>So in <code>getCompanyFolders</code>, your deferred objects are being returned by the calls to <code>getReportFolders</code>. Those results are what should be pushed into an array and passed to <code>$.when</code>:</p> <pre><code>function getCompanyFolders() { var getCompanyFoldersDeferred = $.Deferred(); WL.api({ path: "/me/skydrive/shared", method: "GET" }).then( function(response) { companyFolders = []; reportFolders = []; reports = []; var deferreds = []; // &lt;------- new array to hold deferred objects for (var i = 0; i &lt; response.data.length; i++) { if (response.data[i].type == "folder") { companyFolders.push(response.data[i]); deferreds.push(getReportFolders(response.data[i].id + "/files/", companyFolders.length - 1)); // &lt;------- hang on to the results from this function } } $.when.apply($, deferreds).done(function() { // &lt;--- wait on all the deferreds to resolve getCompanyFoldersDeferred.resolve(); }); }, function(response) { log("Cannot get files and folders: " + JSON.stringify(response.error).replace(/,/g, ",\n")); }); return getCompanyFoldersDeferred.promise(); } </code></pre> <p><code>getReportsFolders</code> needs to be changed similarly.</p> <p><code>getReports</code> doesn't need to wait on anything else to resolve. Once we hit the callback, we're done:</p> <pre><code>function getReports(path, index1, index2) { var getReportsDeferred = $.Deferred(); //var index3 = 0; WL.api({ path: path, method: "GET" }).then( function(response) { reports[index1][index2] = []; for (var i = 0; i &lt; response.data.length; i++) { if (response.data[i].type == "file") { reports[index1][index2].push(response.data[i]); //index3++; } } getReportsDeferred.resolve(); // &lt;---- all done, nothing else to wait on. }, function(response) { log("Cannot get files and folders: " + JSON.stringify(response.error).replace(/,/g, ",\n")); }); return getReportsDeferred.promise(); } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload