code: function processForEachMember(state, member, templNode, siblingNode, data, paramName, frame) {
    state.stack.push(frame);
    try {
      var cState = cloneState(state);
      handleAsync(member, siblingNode, function(reply, node) {
        // Clone data because we can't be sure that we can safely mutate it
        var newData = Object.create(null);
        Object.keys(data).forEach(function(key) {
          newData[key] = data[key];
        });
        newData[paramName] = reply;
        if (node.parentNode != null) {
          var clone;
          if (templNode.nodeName.toLowerCase() === 'loop') {
            for (var i = 0; i < templNode.childNodes.length; i++) {
              clone = templNode.childNodes[i].cloneNode(true);
              node.parentNode.insertBefore(clone, node);
              processNode(cState, clone, newData);
            }
          }
          else {
            clone = templNode.cloneNode(true);
            clone.removeAttribute('foreach');
            node.parentNode.insertBefore(clone, node);
            processNode(cState, clone, newData);
          }
        }
      });
    }
    finally {
      state.stack.pop();
    }
  }
docs: Called by processForEachLoop() to resolve any promises in the array (the
  array itself can also be a promise, but that is resolved by
  processForEach()). Handle <LOOP> elements (which are taken out of the DOM),
  clone the template node, and pass the processing on to processNode().
  @param member The data item to use in templating
  @param templNode The node to copy for each set member
  @param siblingNode The parent node to which we add things
  @param data the data to use for node processing
  @param paramName The name given to 'member' by the foreach attribute
  @param frame A name to push on the stack for debugging