73 lines
1.9 KiB
JavaScript
73 lines
1.9 KiB
JavaScript
"use strict";
|
|
|
|
/* global self, window, module, global, require */
|
|
module.exports = function () {
|
|
|
|
"use strict";
|
|
|
|
var globalObject = void 0;
|
|
|
|
function isFunction(x) {
|
|
return typeof x === "function";
|
|
}
|
|
|
|
// Seek the global object
|
|
if (global !== undefined) {
|
|
globalObject = global;
|
|
} else if (window !== undefined && window.document) {
|
|
globalObject = window;
|
|
} else {
|
|
globalObject = self;
|
|
}
|
|
|
|
// Test for any native promise implementation, and if that
|
|
// implementation appears to conform to the specificaton.
|
|
// This code mostly nicked from the es6-promise module polyfill
|
|
// and then fooled with.
|
|
var hasPromiseSupport = function () {
|
|
|
|
// No promise object at all, and it's a non-starter
|
|
if (!globalObject.hasOwnProperty("Promise")) {
|
|
return false;
|
|
}
|
|
|
|
// There is a Promise object. Does it conform to the spec?
|
|
var P = globalObject.Promise;
|
|
|
|
// Some of these methods are missing from
|
|
// Firefox/Chrome experimental implementations
|
|
if (!P.hasOwnProperty("resolve") || !P.hasOwnProperty("reject")) {
|
|
return false;
|
|
}
|
|
|
|
if (!P.hasOwnProperty("all") || !P.hasOwnProperty("race")) {
|
|
return false;
|
|
}
|
|
|
|
// Older version of the spec had a resolver object
|
|
// as the arg rather than a function
|
|
return function () {
|
|
|
|
var resolve = void 0;
|
|
|
|
var p = new globalObject.Promise(function (r) {
|
|
resolve = r;
|
|
});
|
|
|
|
if (p) {
|
|
return isFunction(resolve);
|
|
}
|
|
|
|
return false;
|
|
}();
|
|
}();
|
|
|
|
// Export the native Promise implementation if it
|
|
// looks like it matches the spec
|
|
if (hasPromiseSupport) {
|
|
return globalObject.Promise;
|
|
}
|
|
|
|
// Otherwise, return the es6-promise polyfill by @jaffathecake.
|
|
return require("es6-promise").Promise;
|
|
}(); |