Skip to content
This repository was archived by the owner on Aug 21, 2022. It is now read-only.

Commit 18cbe29

Browse files
committed
build 0.4.9
1 parent ccbf6e0 commit 18cbe29

12 files changed

+403
-151
lines changed

dev/jscore-ie10.js

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* jsCore JavaScript library v0.4.8 IE10+
1+
/* jsCore JavaScript library v0.4.9 IE10+
22
* © 2014 Dmitry Korobkin
33
* Released under the MIT license
44
* github.com/Octane/jsCore
@@ -598,10 +598,6 @@ window.Promise || (window.Promise = new function () {
598598
return promise._fulfilled || promise._rejected;
599599
}
600600

601-
function allSettled(promises) {
602-
return promises.every(isSettled);
603-
}
604-
605601
function defaultOnFulfilled(value) {
606602
return value;
607603
}
@@ -614,6 +610,24 @@ window.Promise || (window.Promise = new function () {
614610
callback();
615611
}
616612

613+
function dive(thenable, onFulfilled, onRejected) {
614+
function interimOnFulfilled(value) {
615+
if (isThenable(value)) {
616+
toPromise(value).then(interimOnFulfilled, interimOnRejected);
617+
} else {
618+
onFulfilled(value);
619+
}
620+
}
621+
function interimOnRejected(reason) {
622+
if (isThenable(reason)) {
623+
toPromise(reason).then(interimOnFulfilled, interimOnRejected);
624+
} else {
625+
onRejected(reason);
626+
}
627+
}
628+
toPromise(thenable).then(interimOnFulfilled, interimOnRejected);
629+
}
630+
617631
function Promise(resolver) {
618632
Object.assign(this, {
619633
_fulfilled: false,
@@ -643,29 +657,57 @@ window.Promise || (window.Promise = new function () {
643657
});
644658
},
645659

646-
race: function (promises) {
660+
race: function (values) {
647661
return new Promise(function (resolve, reject) {
648-
promises.forEach(function (promise) {
649-
toPromise(promise).then(resolve, reject);
650-
});
662+
var value,
663+
length = values.length,
664+
i = 0;
665+
while (i < length) {
666+
value = values[i];
667+
if (isThenable(value)) {
668+
dive(value, resolve, reject);
669+
} else {
670+
resolve(value);
671+
}
672+
i++;
673+
}
651674
});
652675
},
653676

654-
all: function (promises) {
677+
all: function (values) {
655678
return new Promise(function (resolve, reject) {
656-
var values = [];
657-
promises = promises.map(toPromise);
658-
promises.forEach(function (promise, index) {
659-
promise.then(
660-
function (value) {
661-
values[index] = value;
662-
if (allSettled(promises)) {
663-
resolve(values);
664-
}
665-
},
666-
reject
667-
);
668-
});
679+
var thenables = 0,
680+
fulfilled = 0,
681+
value,
682+
length = values.length,
683+
i = 0;
684+
values = values.slice(0);
685+
while (i < length) {
686+
value = values[i];
687+
if (isThenable(value)) {
688+
thenables++;
689+
dive(
690+
value,
691+
function (index) {
692+
return function (value) {
693+
values[index] = value;
694+
fulfilled++;
695+
if (fulfilled == thenables) {
696+
resolve(values);
697+
}
698+
};
699+
}(i),
700+
reject
701+
);
702+
} else {
703+
//[1, , 3] → [1, undefined, 3]
704+
values[i] = value;
705+
}
706+
i++;
707+
}
708+
if (!thenables) {
709+
resolve(values);
710+
}
669711
});
670712
}
671713

dev/jscore-ie9.js

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* jsCore JavaScript library v0.4.8 IE9+
1+
/* jsCore JavaScript library v0.4.9 IE9+
22
* © 2014 Dmitry Korobkin
33
* Released under the MIT license
44
* github.com/Octane/jsCore
@@ -598,10 +598,6 @@ window.Promise || (window.Promise = new function () {
598598
return promise._fulfilled || promise._rejected;
599599
}
600600

601-
function allSettled(promises) {
602-
return promises.every(isSettled);
603-
}
604-
605601
function defaultOnFulfilled(value) {
606602
return value;
607603
}
@@ -614,6 +610,24 @@ window.Promise || (window.Promise = new function () {
614610
callback();
615611
}
616612

613+
function dive(thenable, onFulfilled, onRejected) {
614+
function interimOnFulfilled(value) {
615+
if (isThenable(value)) {
616+
toPromise(value).then(interimOnFulfilled, interimOnRejected);
617+
} else {
618+
onFulfilled(value);
619+
}
620+
}
621+
function interimOnRejected(reason) {
622+
if (isThenable(reason)) {
623+
toPromise(reason).then(interimOnFulfilled, interimOnRejected);
624+
} else {
625+
onRejected(reason);
626+
}
627+
}
628+
toPromise(thenable).then(interimOnFulfilled, interimOnRejected);
629+
}
630+
617631
function Promise(resolver) {
618632
Object.assign(this, {
619633
_fulfilled: false,
@@ -643,29 +657,57 @@ window.Promise || (window.Promise = new function () {
643657
});
644658
},
645659

646-
race: function (promises) {
660+
race: function (values) {
647661
return new Promise(function (resolve, reject) {
648-
promises.forEach(function (promise) {
649-
toPromise(promise).then(resolve, reject);
650-
});
662+
var value,
663+
length = values.length,
664+
i = 0;
665+
while (i < length) {
666+
value = values[i];
667+
if (isThenable(value)) {
668+
dive(value, resolve, reject);
669+
} else {
670+
resolve(value);
671+
}
672+
i++;
673+
}
651674
});
652675
},
653676

654-
all: function (promises) {
677+
all: function (values) {
655678
return new Promise(function (resolve, reject) {
656-
var values = [];
657-
promises = promises.map(toPromise);
658-
promises.forEach(function (promise, index) {
659-
promise.then(
660-
function (value) {
661-
values[index] = value;
662-
if (allSettled(promises)) {
663-
resolve(values);
664-
}
665-
},
666-
reject
667-
);
668-
});
679+
var thenables = 0,
680+
fulfilled = 0,
681+
value,
682+
length = values.length,
683+
i = 0;
684+
values = values.slice(0);
685+
while (i < length) {
686+
value = values[i];
687+
if (isThenable(value)) {
688+
thenables++;
689+
dive(
690+
value,
691+
function (index) {
692+
return function (value) {
693+
values[index] = value;
694+
fulfilled++;
695+
if (fulfilled == thenables) {
696+
resolve(values);
697+
}
698+
};
699+
}(i),
700+
reject
701+
);
702+
} else {
703+
//[1, , 3] → [1, undefined, 3]
704+
values[i] = value;
705+
}
706+
i++;
707+
}
708+
if (!thenables) {
709+
resolve(values);
710+
}
669711
});
670712
}
671713

dev/jscore-polyfill-ie10.js

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* jsCore JavaScript polyfill v0.4.8 IE10+
1+
/* jsCore JavaScript polyfill v0.4.9 IE10+
22
* © 2014 Dmitry Korobkin
33
* Released under the MIT license
44
* github.com/Octane/jsCore
@@ -598,10 +598,6 @@ window.Promise || (window.Promise = new function () {
598598
return promise._fulfilled || promise._rejected;
599599
}
600600

601-
function allSettled(promises) {
602-
return promises.every(isSettled);
603-
}
604-
605601
function defaultOnFulfilled(value) {
606602
return value;
607603
}
@@ -614,6 +610,24 @@ window.Promise || (window.Promise = new function () {
614610
callback();
615611
}
616612

613+
function dive(thenable, onFulfilled, onRejected) {
614+
function interimOnFulfilled(value) {
615+
if (isThenable(value)) {
616+
toPromise(value).then(interimOnFulfilled, interimOnRejected);
617+
} else {
618+
onFulfilled(value);
619+
}
620+
}
621+
function interimOnRejected(reason) {
622+
if (isThenable(reason)) {
623+
toPromise(reason).then(interimOnFulfilled, interimOnRejected);
624+
} else {
625+
onRejected(reason);
626+
}
627+
}
628+
toPromise(thenable).then(interimOnFulfilled, interimOnRejected);
629+
}
630+
617631
function Promise(resolver) {
618632
Object.assign(this, {
619633
_fulfilled: false,
@@ -643,29 +657,57 @@ window.Promise || (window.Promise = new function () {
643657
});
644658
},
645659

646-
race: function (promises) {
660+
race: function (values) {
647661
return new Promise(function (resolve, reject) {
648-
promises.forEach(function (promise) {
649-
toPromise(promise).then(resolve, reject);
650-
});
662+
var value,
663+
length = values.length,
664+
i = 0;
665+
while (i < length) {
666+
value = values[i];
667+
if (isThenable(value)) {
668+
dive(value, resolve, reject);
669+
} else {
670+
resolve(value);
671+
}
672+
i++;
673+
}
651674
});
652675
},
653676

654-
all: function (promises) {
677+
all: function (values) {
655678
return new Promise(function (resolve, reject) {
656-
var values = [];
657-
promises = promises.map(toPromise);
658-
promises.forEach(function (promise, index) {
659-
promise.then(
660-
function (value) {
661-
values[index] = value;
662-
if (allSettled(promises)) {
663-
resolve(values);
664-
}
665-
},
666-
reject
667-
);
668-
});
679+
var thenables = 0,
680+
fulfilled = 0,
681+
value,
682+
length = values.length,
683+
i = 0;
684+
values = values.slice(0);
685+
while (i < length) {
686+
value = values[i];
687+
if (isThenable(value)) {
688+
thenables++;
689+
dive(
690+
value,
691+
function (index) {
692+
return function (value) {
693+
values[index] = value;
694+
fulfilled++;
695+
if (fulfilled == thenables) {
696+
resolve(values);
697+
}
698+
};
699+
}(i),
700+
reject
701+
);
702+
} else {
703+
//[1, , 3] → [1, undefined, 3]
704+
values[i] = value;
705+
}
706+
i++;
707+
}
708+
if (!thenables) {
709+
resolve(values);
710+
}
669711
});
670712
}
671713

0 commit comments

Comments
 (0)