title: Chaining multiple promises, including Promise.all
body: <p>I have a requirement which requires chaining of Promises. In my Ionic app, I need to iterate over a list of files and zip them. Then the zip needs to be stored on the device itself (iPhone in this case).</p>
  
  <p>I already have the list of files that need to be zipped in an array. So, I am iterating over them and using $cordovaFile getting the binay content of these files. Then I am adding binary to a JSZip object. End result should be that binary content of all the files should be added to zip.file, so that a zip file can be generated.</p>
  
  <pre><code>//wrapping in Promise.all so that we don't proceed until we have the content of all files added to zip
  var zip = new JSZip();
  return Promise.all(
          filesList.forEach(function(file) {
             console.log('file to be added using $cordovaFile '+file); 
             // Getting the content of each file using $cordovaFile. This returns a promise. 
                    return $cordovaFile.readAsBinaryString(cordova.file.dataDirectory + $rootScope.username, file)
                         .then(function(binaryData) {
                          return new Promise(function(resolve, reject) {
                           //Adding content of all files to zip.file so that it can be zipped in the next step.
                              resolve(zip.file(file, binaryData, {binary: true}));
                          })        
                        })
                        .catch(function(error) {
                          console.log('Error during fetch content or zipping '+JSON.stringify(error));
                        })
                   })
               )
  </code></pre>
  
  <p>Once zip.file has all the contents, I am calling another function in JSZip which would generate the zip. This would return a promise as well, so I need to chain to $cordovaFile.writeFile, so that the zip can be written locally. $cordovaFile.writeFile also returns a Promise which would the last promise in the chain.</p>
  
  <pre><code>.then(function(zipData) {
  // async request to generate the zip
                  return zipData.generateAsync({type:"blob"});
              }).then(function (blob) {
    // once we have the zip, save it to the device 
                  $cordovaFile.writeFile(cordova.file.dataDirectory+$rootScope.username, 'abc.zip', blob, true)
                  .then(function(data) {
                     console.log('Zip file written to device at '+cordova.file.dataDirectory+$rootScope.username); 
                  })
              }).catch(function(error) {
                  console.log('Error while zipping and writing '+JSON.stringify(error));
              })  
  </code></pre>
  
  <p>This is how the complete code looks like</p>
  
  <pre><code>var zipFiles = function(filesList) {
  var zip = new JSZip();
  
               return Promise.all(
                  filesList.forEach(function(file) {
                     return $cordovaFile.readAsBinaryString(cordova.file.dataDirectory + $rootScope.username, file)
                        .then(function(binaryData) {
                          return new Promise(function(resolve, reject) {
                              resolve(zip.file(file, binaryData, {binary: true}));
                          })        
                        })
                        .catch(function(error) {
                          console.log('Error during fetch content or zipping '+JSON.stringify(error));
                        })
                   })
               )
              .then(function(zipData) {
                  return zipData.generateAsync({type:"blob"});
              }).then(function (blob) {
                  $cordovaFile.writeFile(cordova.file.dataDirectory+$rootScope.username, 'abc.zip', blob, true)
                  .then(function(data) {
                     console.log('Zip file written to device at '+cordova.file.dataDirectory+$rootScope.username); 
                  })
              }).catch(function(error) {
                  console.log('Error while zipping and writing '+JSON.stringify(error));
              }) 
  } 
  </code></pre>
  
  <p>Challenge is that after Promise.all completes, nothing gets executed. So, nothing starting 'then(function(zipData)' gets executed.</p>
  
  <p>I feel it has something to do with the way I am chaining Promises. Any help will be highly appreciated.</p>