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

Commit 27157b3

Browse files
committed
promises support thenable, fix Octane/Promise#4
1 parent a111131 commit 27157b3

13 files changed

+483
-308
lines changed

dev/jscore-ie10.js

Lines changed: 68 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -559,12 +559,32 @@ window.setImmediate || Object.assign(window, new function () {
559559

560560
window.Promise || (window.Promise = new function () {
561561

562-
//todo thenable value support
562+
function toPromise(thenable) {
563+
if (isPromise(thenable)) {
564+
return thenable;
565+
}
566+
return new Promise(function (resolve, reject) {
567+
//execute thenable.then asynchronously
568+
//github.com/getify/native-promise-only/issues/5
569+
//github.com/domenic/promises-unwrapping/issues/105
570+
window.setImmediate(function () {
571+
try {
572+
thenable.then(resolve, reject);
573+
} catch (error) {
574+
reject(error);
575+
}
576+
});
577+
});
578+
}
563579

564580
function isPromise(anything) {
565581
return anything instanceof Promise;
566582
}
567583

584+
function isThenable(anything) {
585+
return 'then' in Object(anything);
586+
}
587+
568588
function isSettled(promise) {
569589
return promise._fulfilled || promise._rejected;
570590
}
@@ -597,45 +617,50 @@ window.Promise || (window.Promise = new function () {
597617
this._resolve(resolver);
598618
}
599619

600-
Promise.resolve = function (value) {
601-
if (isPromise(value)) {
602-
return value.then(defaultOnFulfilled, defaultOnRejected);
603-
}
604-
return new Promise(function (resolve) {
605-
resolve(value);
606-
});
607-
};
620+
Object.assign(Promise, {
608621

609-
Promise.reject = function (reason) {
610-
return new Promise(function (resolve, reject) {
611-
reject(reason);
612-
});
613-
};
622+
resolve: function (value) {
623+
if (isThenable(value)) {
624+
return toPromise(value);
625+
}
626+
return new Promise(function (resolve) {
627+
resolve(value);
628+
});
629+
},
614630

615-
Promise.race = function (promises) {
616-
return new Promise(function (resolve, reject) {
617-
Array.forEach(promises, function (promise) {
618-
promise.then(resolve, reject);
631+
reject: function (reason) {
632+
return new Promise(function (resolve, reject) {
633+
reject(reason);
619634
});
620-
});
621-
};
635+
},
622636

623-
Promise.all = function (promises) {
624-
return new Promise(function (resolve, reject) {
625-
var values = [];
626-
Array.forEach(promises, function (promise, index) {
627-
promise.then(
628-
function (value) {
629-
values[index] = value;
630-
if (allSettled(promises)) {
631-
resolve(values);
632-
}
633-
},
634-
reject
635-
);
637+
race: function (promises) {
638+
return new Promise(function (resolve, reject) {
639+
Array.forEach(promises, function (promise) {
640+
toPromise(promise).then(resolve, reject);
641+
});
636642
});
637-
});
638-
};
643+
},
644+
645+
all: function (promises) {
646+
return new Promise(function (resolve, reject) {
647+
var values = [];
648+
promises = Array.map(promises, toPromise);
649+
promises.forEach(function (promise, index) {
650+
promise.then(
651+
function (value) {
652+
values[index] = value;
653+
if (allSettled(promises)) {
654+
resolve(values);
655+
}
656+
},
657+
reject
658+
);
659+
});
660+
});
661+
}
662+
663+
});
639664

640665
Object.assign(Promise.prototype, {
641666

@@ -704,13 +729,13 @@ window.Promise || (window.Promise = new function () {
704729
try {
705730
value = onFulfilled(promise._value);
706731
} catch (error) {
707-
window.setImmediate(reject, error);
732+
reject(error);
708733
return;
709734
}
710-
if (isPromise(value)) {
711-
value.then(resolve, reject);
735+
if (isThenable(value)) {
736+
toPromise(value).then(resolve, reject);
712737
} else {
713-
window.setImmediate(resolve, value);
738+
resolve(value);
714739
}
715740
});
716741
}
@@ -721,13 +746,13 @@ window.Promise || (window.Promise = new function () {
721746
try {
722747
reason = onRejected(promise._reason);
723748
} catch (error) {
724-
window.setImmediate(reject, error);
749+
reject(error);
725750
return;
726751
}
727-
if (isPromise(reason)) {
728-
reason.then(resolve, reject);
752+
if (isThenable(reason)) {
753+
toPromise(reason).then(resolve, reject);
729754
} else {
730-
window.setImmediate(resolve, reason);
755+
resolve(reason);
731756
}
732757
});
733758
}

dev/jscore-ie9.js

Lines changed: 68 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -559,12 +559,32 @@ window.setImmediate || Object.assign(window, new function () {
559559

560560
window.Promise || (window.Promise = new function () {
561561

562-
//todo thenable value support
562+
function toPromise(thenable) {
563+
if (isPromise(thenable)) {
564+
return thenable;
565+
}
566+
return new Promise(function (resolve, reject) {
567+
//execute thenable.then asynchronously
568+
//github.com/getify/native-promise-only/issues/5
569+
//github.com/domenic/promises-unwrapping/issues/105
570+
window.setImmediate(function () {
571+
try {
572+
thenable.then(resolve, reject);
573+
} catch (error) {
574+
reject(error);
575+
}
576+
});
577+
});
578+
}
563579

564580
function isPromise(anything) {
565581
return anything instanceof Promise;
566582
}
567583

584+
function isThenable(anything) {
585+
return 'then' in Object(anything);
586+
}
587+
568588
function isSettled(promise) {
569589
return promise._fulfilled || promise._rejected;
570590
}
@@ -597,45 +617,50 @@ window.Promise || (window.Promise = new function () {
597617
this._resolve(resolver);
598618
}
599619

600-
Promise.resolve = function (value) {
601-
if (isPromise(value)) {
602-
return value.then(defaultOnFulfilled, defaultOnRejected);
603-
}
604-
return new Promise(function (resolve) {
605-
resolve(value);
606-
});
607-
};
620+
Object.assign(Promise, {
608621

609-
Promise.reject = function (reason) {
610-
return new Promise(function (resolve, reject) {
611-
reject(reason);
612-
});
613-
};
622+
resolve: function (value) {
623+
if (isThenable(value)) {
624+
return toPromise(value);
625+
}
626+
return new Promise(function (resolve) {
627+
resolve(value);
628+
});
629+
},
614630

615-
Promise.race = function (promises) {
616-
return new Promise(function (resolve, reject) {
617-
Array.forEach(promises, function (promise) {
618-
promise.then(resolve, reject);
631+
reject: function (reason) {
632+
return new Promise(function (resolve, reject) {
633+
reject(reason);
619634
});
620-
});
621-
};
635+
},
622636

623-
Promise.all = function (promises) {
624-
return new Promise(function (resolve, reject) {
625-
var values = [];
626-
Array.forEach(promises, function (promise, index) {
627-
promise.then(
628-
function (value) {
629-
values[index] = value;
630-
if (allSettled(promises)) {
631-
resolve(values);
632-
}
633-
},
634-
reject
635-
);
637+
race: function (promises) {
638+
return new Promise(function (resolve, reject) {
639+
Array.forEach(promises, function (promise) {
640+
toPromise(promise).then(resolve, reject);
641+
});
636642
});
637-
});
638-
};
643+
},
644+
645+
all: function (promises) {
646+
return new Promise(function (resolve, reject) {
647+
var values = [];
648+
promises = Array.map(promises, toPromise);
649+
promises.forEach(function (promise, index) {
650+
promise.then(
651+
function (value) {
652+
values[index] = value;
653+
if (allSettled(promises)) {
654+
resolve(values);
655+
}
656+
},
657+
reject
658+
);
659+
});
660+
});
661+
}
662+
663+
});
639664

640665
Object.assign(Promise.prototype, {
641666

@@ -704,13 +729,13 @@ window.Promise || (window.Promise = new function () {
704729
try {
705730
value = onFulfilled(promise._value);
706731
} catch (error) {
707-
window.setImmediate(reject, error);
732+
reject(error);
708733
return;
709734
}
710-
if (isPromise(value)) {
711-
value.then(resolve, reject);
735+
if (isThenable(value)) {
736+
toPromise(value).then(resolve, reject);
712737
} else {
713-
window.setImmediate(resolve, value);
738+
resolve(value);
714739
}
715740
});
716741
}
@@ -721,13 +746,13 @@ window.Promise || (window.Promise = new function () {
721746
try {
722747
reason = onRejected(promise._reason);
723748
} catch (error) {
724-
window.setImmediate(reject, error);
749+
reject(error);
725750
return;
726751
}
727-
if (isPromise(reason)) {
728-
reason.then(resolve, reject);
752+
if (isThenable(reason)) {
753+
toPromise(reason).then(resolve, reject);
729754
} else {
730-
window.setImmediate(resolve, reason);
755+
resolve(reason);
731756
}
732757
});
733758
}

0 commit comments

Comments
 (0)