docs: function() {
              // Get the resource's new metadata
              self.resources.get(createdResource.id, function(err, resource) {
                  if (err) {
                      return callbacks.error(err);
                  }
  
                  // Check thumbnails
                  var thumbnailsDone = _.chain(resource.thumbnails)
                      .filter({'status': 'pending'})
                      .isEmpty()
                      .value();
                  if (thumbnailsDone) {
                      callbacks.thumbnails(resource.thumbnails);
                  }
  
                  // Check the images
                  var imagesDone = _.chain(resource.images)
                      .filter({'status': 'pending'})
                      .isEmpty()
                      .value();
                  if (imagesDone) {
                      callbacks.images(resource.images);
                  }
  
                  // If there are no pending processors left, we're done and can return to the caller
                  if (resource.status !== 'pending') {
                      return callbacks.complete(resource);
  
                  // Continue polling as long as there are still pending processors
                  } else {
                      // Add a quarter of the polling timeout each time we check whether new updates
                      // are available. This will ensure that the interval gradually backs off.
                      pollingTimeout += Math.round(pollingTimeout / Embdr.DEFAULT_POLLING_BACKOFF_DENOMINATOR);
                      if (pollingTimeout > Embdr.MAX_POLLING_TIMEOUT) {
                          pollingTimeout = Embdr.MAX_POLLING_TIMEOUT;
                      }
                      setTimeout(poll, pollingTimeout);
                  }
              });
          }