function PromiseAll(iterable) {
  if (!IS_RECEIVER(this)) {
    throw MakeTypeError(kCalledOnNonObject, "Promise.all");
  }

  var deferred = NewPromiseCapability(this);
  var resolutions = new InternalArray();
  var count;

  function CreateResolveElementFunction(index, values, promiseCapability) {
    var alreadyCalled = false;
    return (x) => {
      if (alreadyCalled === true) return;
      alreadyCalled = true;
      values[index] = x;
      if (--count === 0) {
        var valuesArray = [];
        %MoveArrayContents(values, valuesArray);
        %_Call(promiseCapability.resolve, UNDEFINED, valuesArray);
      }
    };
  }

  try {
    var i = 0;
    count = 1;
    for (var value of iterable) {
      var nextPromise = this.resolve(value);
      ++count;
      nextPromise.then(
          CreateResolveElementFunction(i, resolutions, deferred),
          deferred.reject);
      SET_PRIVATE(deferred.reject, promiseCombinedDeferredSymbol, deferred);
      ++i;
    }

    // 6.d
    if (--count === 0) {
      var valuesArray = [];
      %MoveArrayContents(resolutions, valuesArray);
      %_Call(deferred.resolve, UNDEFINED, valuesArray);
    }

  } catch (e) {
    %_Call(deferred.reject, UNDEFINED, e);
  }
  return deferred.promise;
}
function PromiseAll(iterable) {
  if (!IS_RECEIVER(this)) {
    throw MakeTypeError(kCalledOnNonObject, "Promise.all");
  }

  var deferred = NewPromiseCapability(this);
  var resolutions = new InternalArray();
  var count;

  function CreateResolveElementFunction(index, values, promiseCapability) {
    var alreadyCalled = false;
    return (x) => {
      if (alreadyCalled === true) return;
      alreadyCalled = true;
      values[index] = x;
      if (--count === 0) {
        var valuesArray = [];
        %MoveArrayContents(values, valuesArray);
        %_Call(promiseCapability.resolve, UNDEFINED, valuesArray);
      }
    };
  }

  try {
    var i = 0;
    count = 1;
    for (var value of iterable) {
      var nextPromise = this.resolve(value);
      ++count;
      nextPromise.then(
          CreateResolveElementFunction(i, resolutions, deferred),
          deferred.reject);
      SET_PRIVATE(deferred.reject, promiseCombinedDeferredSymbol, deferred);
      ++i;
    }

    
    if (--count === 0) {
      var valuesArray = [];
      %MoveArrayContents(resolutions, valuesArray);
      %_Call(deferred.resolve, UNDEFINED, valuesArray);
    }

  } catch (e) {
    %_Call(deferred.reject, UNDEFINED, e);
  }
  return deferred.promise;
}
function PromiseAll ( iterable ) { if ( ! IS_RECEIVER ( this ) ) { throw MakeTypeError ( kCalledOnNonObject , "Promise.all" ) ; } var deferred = NewPromiseCapability ( this ) ; var resolutions = new InternalArray ( ) ; var count ; function CreateResolveElementFunction ( index , values , promiseCapability ) { var alreadyCalled = false ; return ( x ) => { if ( alreadyCalled === true ) return ; alreadyCalled = true ; values [ index ] = x ; if ( -- count === 0 ) { var valuesArray = [ ] ; % MoveArrayContents ( values , valuesArray ) ; % _Call ( promiseCapability . resolve , UNDEFINED , valuesArray ) ; } } ; } try { var i = 0 ; count = 1 ; for ( var value of iterable ) { var nextPromise = this . resolve ( value ) ; ++ count ; nextPromise . then ( CreateResolveElementFunction ( i , resolutions , deferred ) , deferred . reject ) ; SET_PRIVATE ( deferred . reject , promiseCombinedDeferredSymbol , deferred ) ; ++ i ; } // 6.d if ( -- count === 0 ) { var valuesArray = [ ] ; % MoveArrayContents ( resolutions , valuesArray ) ; % _Call ( deferred . resolve , UNDEFINED , valuesArray ) ; } } catch ( e ) { % _Call ( deferred . reject , UNDEFINED , e ) ; } return deferred . promise ; }
ES#sec-promise.all Promise.all ( iterable )
ES#sec - promise . all Promise . all ( iterable )