docs: function() {
            if (done) {
              logger.tracef('Iterator(iteratorId=%s) already exhausted', iterId);
              return donePromise();
            } else if (_.isEmpty(nextElems)) {
              var ctx = u.context(SMALL);
              logger.tracef(
                  'Invoke iterator.next(msgId=%d,iteratorId=%s) on %s'
                  , ctx.id, iterId, conn.toString()
              );
              var remote = futurePinned(ctx, 0x33, p.encodeIterId(iterId), p.decodeNextEntries(), conn);
              return remote.then(function(entries) {
                if (_.isEmpty(entries)) {
                  done = true;
                  return donePromise();
                } else {
                  _.each(entries, function(entry) {
                    nextElems.push(entry);
                  });
                  return nextPromise();
                }
              });
            }
            logger.tracef('Return next from locally cached entries for iterator(iteratorId=%s)', iterId);
            return nextPromise();
          }