docs: function(callback, options) {
        options = options || {};
  
        if (this._order || this._skip || (this._limit >= 0)) {
          var error =
            "Cannot iterate on a query with sort, skip, or limit.";
          return Parse.Promise.error(error)._thenRunCallbacks(options);
        }
  
        var promise = new Parse.Promise();
  
        var query = new Parse.Query(this.objectClass);
        // We can override the batch size from the options.
        // This is undocumented, but useful for testing.
        query._limit = options.batchSize || 100;
        query._where = _.clone(this._where);
        query._include = _.clone(this._include);
  
        query.ascending('objectId');
  
        var finished = false;
        return Parse.Promise._continueWhile(function() {
          return !finished;
  
        }, function() {
          return query.find().then(function(results) {
            var callbacksDone = Parse.Promise.as();
            Parse._.each(results, function(result) {
              callbacksDone = callbacksDone.then(function() {
                return callback(result);
              });
            });
  
            return callbacksDone.then(function() {
              if (results.length >= query._limit) {
                query.greaterThan("objectId", results[results.length - 1].id);
              } else {
                finished = true;
              }
            });
          });
        })._thenRunCallbacks(options);
      }