function iterate(fieldNames, idx, fieldsAndValues, done) {
      if (idx >= fieldNames.length) {
        done(null, fieldsAndValues);
      }
      else {
        getKeyDetailsHashField(key, fieldNames[idx], redisConnection, function (errDetails, result) {
          if (errDetails) {
            return done(errDetails);
          }
          // if the strlen > 0 and the result value is undefined then we want to return an explicit
          // null value, so it can be interpreted as a deferred lookup value
          fieldsAndValues[fieldNames[idx]] = (result[0] < config.get("ui.maxHashFieldSize"))? result[1] : null;
          iterate(fieldNames, idx + 1, fieldsAndValues, done);
        });
      }
    }
@param {string[]} fieldNames list of all field names
@param {number} idx index of field name to work on
@param {Map<string, string>} fieldsAndValues the map of fields to values
@param {function} done final callback