Chromium Code Reviews| Index: src/promise.js |
| diff --git a/src/promise.js b/src/promise.js |
| index c096296b0eb2b48696dc2490e70c2f7243cad653..dade04a844e3e0514c8ad6e468141f1440a4bf8e 100644 |
| --- a/src/promise.js |
| +++ b/src/promise.js |
| @@ -301,51 +301,44 @@ var lastMicrotaskId = 0; |
| return IsPromise(x) ? x : new this(function(resolve) { resolve(x) }); |
| } |
| - function PromiseAll(values) { |
| + function PromiseAll(iterable) { |
| var deferred = %_CallFunction(this, PromiseDeferred); |
| var resolutions = []; |
| - if (!%_IsArray(values)) { |
| - deferred.reject(MakeTypeError('invalid_argument')); |
| - return deferred.promise; |
| - } |
| try { |
| - var count = values.length; |
| - if (count === 0) { |
| - deferred.resolve(resolutions); |
| - } else { |
| - for (var i = 0; i < values.length; ++i) { |
| - this.resolve(values[i]).then( |
| - (function() { |
| - // Nested scope to get closure over current i (and avoid .bind). |
| - // TODO(rossberg): Use for-let instead once available. |
| - var i_captured = i; |
| + var count = 0; |
| + var i = 0; |
| + for (var value of iterable) { |
| + this.resolve(value).then( |
| + // Nested scope to get closure over current i (and avoid .bind). |
|
arv (Not doing code reviews)
2015/02/23 16:40:39
Andreas, do you think it would make sense to switc
rossberg
2015/02/23 17:38:40
Probably. The comment is outdated either way, beca
arv (Not doing code reviews)
2015/02/23 17:42:45
Yup.
I'll make the change... scratch that. Builti
|
| + // TODO(rossberg): Use for-let instead once available. |
| + (function(i) { |
| return function(x) { |
| - resolutions[i_captured] = x; |
| + resolutions[i] = x; |
| if (--count === 0) deferred.resolve(resolutions); |
| - }; |
| - })(), |
| - function(r) { deferred.reject(r) } |
| - ); |
| - } |
| + } |
| + })(i), |
| + function(r) { deferred.reject(r); }); |
| + ++i; |
| + ++count; |
| + } |
| + |
| + if (count === 0) { |
| + deferred.resolve(resolutions); |
| } |
| + |
| } catch (e) { |
| deferred.reject(e) |
| } |
| return deferred.promise; |
| } |
| - function PromiseOne(values) { |
| + function PromiseRace(iterable) { |
| var deferred = %_CallFunction(this, PromiseDeferred); |
| - if (!%_IsArray(values)) { |
| - deferred.reject(MakeTypeError('invalid_argument')); |
| - return deferred.promise; |
| - } |
| try { |
| - for (var i = 0; i < values.length; ++i) { |
| - this.resolve(values[i]).then( |
| - function(x) { deferred.resolve(x) }, |
| - function(r) { deferred.reject(r) } |
| - ); |
| + for (var value of iterable) { |
| + this.resolve(value).then( |
| + function(x) { deferred.resolve(x) }, |
| + function(r) { deferred.reject(r) }); |
| } |
| } catch (e) { |
| deferred.reject(e) |
| @@ -388,7 +381,7 @@ var lastMicrotaskId = 0; |
| "accept", PromiseResolved, |
| "reject", PromiseRejected, |
| "all", PromiseAll, |
| - "race", PromiseOne, |
| + "race", PromiseRace, |
| "resolve", PromiseCast |
| ]); |
| InstallFunctions($Promise.prototype, DONT_ENUM, [ |