docs: function asyncArray(p) {
      var ret;
      if (!p || !p.__isArrayAsync__) {
          ret = merge(when(p), {
              promise: function () {
                  return asyncArray(this);
              }
          });
          forEach(methods, function (m) {
              var func = asyncExports[m];
              ret[m] = function () {
                  var args = argsToArray(arguments), mRet = new Promise();
                  nextTick(function () {
                      func.apply(null, [ret].concat(args)).then(mRet);
                  });
                  return asyncArray(mRet);
              };
          });
          ret.__isArrayAsync__ = true;
      } else {
          ret = p;
      }
      p = null;
      return ret;
  }