UNPKG

vuikit

Version:

A Vuejs component library based on UIkit

184 lines (152 loc) 3.75 kB
/** * Vuikit 0.7.0 * (c) 2018 Miljan Aleksic * @license MIT */ import { isFunction, isObject } from 'vuikit/core/util' /** * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis) */ const RESOLVED = 0 const REJECTED = 1 const PENDING = 2 const async = 'setImmediate' in window ? setImmediate : setTimeout export default 'Promise' in window ? window.Promise : Promise function Promise (executor) { this.state = PENDING this.value = undefined this.deferred = [] const promise = this try { executor(function (x) { promise.resolve(x) }, function (r) { promise.reject(r) }) } catch (e) { promise.reject(e) } } Promise.reject = function (r) { return new Promise(function (resolve, reject) { reject(r) }) } Promise.resolve = function (x) { return new Promise(function (resolve, reject) { resolve(x) }) } Promise.all = function all (iterable) { return new Promise(function (resolve, reject) { let count = 0 const result = [] if (iterable.length === 0) { resolve(result) } function resolver (i) { return function (x) { result[i] = x count += 1 if (count === iterable.length) { resolve(result) } } } for (var i = 0; i < iterable.length; i += 1) { Promise.resolve(iterable[i]).then(resolver(i), reject) } }) } Promise.race = function race (iterable) { return new Promise(function (resolve, reject) { for (var i = 0; i < iterable.length; i += 1) { Promise.resolve(iterable[i]).then(resolve, reject) } }) } const p = Promise.prototype p.resolve = function resolve (x) { var promise = this if (promise.state === PENDING) { if (x === promise) { throw new TypeError('Promise settled with itself.') } var called = false try { var then = x && x.then if (x !== null && isObject(x) && isFunction(then)) { then.call(x, function (x) { if (!called) { promise.resolve(x) } called = true }, function (r) { if (!called) { promise.reject(r) } called = true }) return } } catch (e) { if (!called) { promise.reject(e) } return } promise.state = RESOLVED promise.value = x promise.notify() } } p.reject = function reject (reason) { var promise = this if (promise.state === PENDING) { if (reason === promise) { throw new TypeError('Promise settled with itself.') } promise.state = REJECTED promise.value = reason promise.notify() } } p.notify = function notify () { async(() => { if (this.state !== PENDING) { while (this.deferred.length) { const deferred = this.deferred.shift() const onResolved = deferred[0] const onRejected = deferred[1] const resolve = deferred[2] const reject = deferred[3] try { if (this.state === RESOLVED) { if (isFunction(onResolved)) { resolve(onResolved(this.value)) } else { resolve(this.value) } } else if (this.state === REJECTED) { if (isFunction(onRejected)) { resolve(onRejected(this.value)) } else { reject(this.value) } } } catch (e) { reject(e) } } } }) } p.then = function then (onResolved, onRejected) { return new Promise((resolve, reject) => { this.deferred.push([onResolved, onRejected, resolve, reject]) this.notify() }) } p.catch = function (onRejected) { return this.then(undefined, onRejected) }