780 lines
26 KiB
JavaScript
780 lines
26 KiB
JavaScript
|
|
//兼容1.92(2022-4-2)删除的方法
|
|||
|
|
//还需要手动修改 Cesium\Workers\when-8d13db60.js
|
|||
|
|
|
|||
|
|
// import { c as createCommonjsModule } from './_commonjsHelpers-3aae1032.js';
|
|||
|
|
function createCommonjsModule(fn, basedir, module) {
|
|||
|
|
return (
|
|||
|
|
(module = {
|
|||
|
|
path: basedir,
|
|||
|
|
exports: {},
|
|||
|
|
require: function (path, base) {
|
|||
|
|
return commonjsRequire(path, base === undefined || base === null ? module.path : base);
|
|||
|
|
},
|
|||
|
|
}),
|
|||
|
|
fn(module, module.exports),
|
|||
|
|
module.exports
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var when = createCommonjsModule(function (module, exports) {
|
|||
|
|
/** @license MIT License (c) copyright B Cavalier & J Hann */
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* A lightweight CommonJS Promises/A and when() implementation
|
|||
|
|
* when is part of the cujo.js family of libraries (http://cujojs.com/)
|
|||
|
|
*
|
|||
|
|
* Licensed under the MIT License at:
|
|||
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|||
|
|
*
|
|||
|
|
* @version 1.7.1
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
(function (define) {
|
|||
|
|
define(function () {
|
|||
|
|
var reduceArray, slice, undef;
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// Public API
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
when.defer = defer; // Create a deferred
|
|||
|
|
when.resolve = resolve; // Create a resolved promise
|
|||
|
|
when.reject = reject; // Create a rejected promise
|
|||
|
|
|
|||
|
|
when.join = join; // Join 2 or more promises
|
|||
|
|
|
|||
|
|
when.all = all; // Resolve a list of promises
|
|||
|
|
when.map = map; // Array.map() for promises
|
|||
|
|
when.reduce = reduce; // Array.reduce() for promises
|
|||
|
|
|
|||
|
|
when.any = any; // One-winner race
|
|||
|
|
when.some = some; // Multi-winner race
|
|||
|
|
|
|||
|
|
when.chain = chain; // Make a promise trigger another resolver
|
|||
|
|
|
|||
|
|
when.isPromise = isPromise; // Determine if a thing is a promise
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Register an observer for a promise or immediate value.
|
|||
|
|
*
|
|||
|
|
* @param {*} promiseOrValue
|
|||
|
|
* @param {function?} [onFulfilled] callback to be called when promiseOrValue is
|
|||
|
|
* successfully fulfilled. If promiseOrValue is an immediate value, callback
|
|||
|
|
* will be invoked immediately.
|
|||
|
|
* @param {function?} [onRejected] callback to be called when promiseOrValue is
|
|||
|
|
* rejected.
|
|||
|
|
* @param {function?} [onProgress] callback to be called when progress updates
|
|||
|
|
* are issued for promiseOrValue.
|
|||
|
|
* @returns {Promise} a new {@link Promise} that will complete with the return
|
|||
|
|
* value of callback or errback or the completion value of promiseOrValue if
|
|||
|
|
* callback and/or errback is not supplied.
|
|||
|
|
*/
|
|||
|
|
function when(promiseOrValue, onFulfilled, onRejected, onProgress) {
|
|||
|
|
// Get a trusted promise for the input promiseOrValue, and then
|
|||
|
|
// register promise handlers
|
|||
|
|
return resolve(promiseOrValue).then(onFulfilled, onRejected, onProgress);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Returns promiseOrValue if promiseOrValue is a {@link Promise}, a new Promise if
|
|||
|
|
* promiseOrValue is a foreign promise, or a new, already-fulfilled {@link Promise}
|
|||
|
|
* whose value is promiseOrValue if promiseOrValue is an immediate value.
|
|||
|
|
*
|
|||
|
|
* @param {*} promiseOrValue
|
|||
|
|
* @returns Guaranteed to return a trusted Promise. If promiseOrValue is a when.js {@link Promise}
|
|||
|
|
* returns promiseOrValue, otherwise, returns a new, already-resolved, when.js {@link Promise}
|
|||
|
|
* whose resolution value is:
|
|||
|
|
* * the resolution value of promiseOrValue if it's a foreign promise, or
|
|||
|
|
* * promiseOrValue if it's a value
|
|||
|
|
*/
|
|||
|
|
function resolve(promiseOrValue) {
|
|||
|
|
var promise, deferred;
|
|||
|
|
|
|||
|
|
if (promiseOrValue instanceof Promise) {
|
|||
|
|
// It's a when.js promise, so we trust it
|
|||
|
|
promise = promiseOrValue;
|
|||
|
|
} else {
|
|||
|
|
// It's not a when.js promise. See if it's a foreign promise or a value.
|
|||
|
|
if (isPromise(promiseOrValue)) {
|
|||
|
|
// It's a thenable, but we don't know where it came from, so don't trust
|
|||
|
|
// its implementation entirely. Introduce a trusted middleman when.js promise
|
|||
|
|
deferred = defer();
|
|||
|
|
|
|||
|
|
// IMPORTANT: This is the only place when.js should ever call .then() on an
|
|||
|
|
// untrusted promise. Don't expose the return value to the untrusted promise
|
|||
|
|
promiseOrValue.then(
|
|||
|
|
function (value) {
|
|||
|
|
deferred.resolve(value);
|
|||
|
|
},
|
|||
|
|
function (reason) {
|
|||
|
|
deferred.reject(reason);
|
|||
|
|
},
|
|||
|
|
function (update) {
|
|||
|
|
deferred.progress(update);
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
promise = deferred.promise;
|
|||
|
|
} else {
|
|||
|
|
// It's a value, not a promise. Create a resolved promise for it.
|
|||
|
|
promise = fulfilled(promiseOrValue);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return promise;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Returns a rejected promise for the supplied promiseOrValue. The returned
|
|||
|
|
* promise will be rejected with:
|
|||
|
|
* - promiseOrValue, if it is a value, or
|
|||
|
|
* - if promiseOrValue is a promise
|
|||
|
|
* - promiseOrValue's value after it is fulfilled
|
|||
|
|
* - promiseOrValue's reason after it is rejected
|
|||
|
|
* @param {*} promiseOrValue the rejected value of the returned {@link Promise}
|
|||
|
|
* @return {Promise} rejected {@link Promise}
|
|||
|
|
*/
|
|||
|
|
function reject(promiseOrValue) {
|
|||
|
|
return when(promiseOrValue, rejected);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Trusted Promise constructor. A Promise created from this constructor is
|
|||
|
|
* a trusted when.js promise. Any other duck-typed promise is considered
|
|||
|
|
* untrusted.
|
|||
|
|
* @constructor
|
|||
|
|
* @name Promise
|
|||
|
|
*/
|
|||
|
|
function Promise(then) {
|
|||
|
|
this.then = then;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Promise.prototype = {
|
|||
|
|
/**
|
|||
|
|
* Register a callback that will be called when a promise is
|
|||
|
|
* fulfilled or rejected. Optionally also register a progress handler.
|
|||
|
|
* Shortcut for .then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress)
|
|||
|
|
* @param {function?} [onFulfilledOrRejected]
|
|||
|
|
* @param {function?} [onProgress]
|
|||
|
|
* @return {Promise}
|
|||
|
|
*/
|
|||
|
|
always: function (onFulfilledOrRejected, onProgress) {
|
|||
|
|
return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress);
|
|||
|
|
},
|
|||
|
|
finally: function (onFulfilledOrRejected, onProgress) {
|
|||
|
|
return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress);
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Register a rejection handler. Shortcut for .then(undefined, onRejected)
|
|||
|
|
* @param {function?} onRejected
|
|||
|
|
* @return {Promise}
|
|||
|
|
*/
|
|||
|
|
otherwise: function (onRejected) {
|
|||
|
|
return this.then(undef, onRejected);
|
|||
|
|
},
|
|||
|
|
catch: function (onRejected) {
|
|||
|
|
return this.then(undef, onRejected);
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Shortcut for .then(function() { return value; })
|
|||
|
|
* @param {*} value
|
|||
|
|
* @return {Promise} a promise that:
|
|||
|
|
* - is fulfilled if value is not a promise, or
|
|||
|
|
* - if value is a promise, will fulfill with its value, or reject
|
|||
|
|
* with its reason.
|
|||
|
|
*/
|
|||
|
|
yield: function (value) {
|
|||
|
|
return this.then(function () {
|
|||
|
|
return value;
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Assumes that this promise will fulfill with an array, and arranges
|
|||
|
|
* for the onFulfilled to be called with the array as its argument list
|
|||
|
|
* i.e. onFulfilled.spread(undefined, array).
|
|||
|
|
* @param {function} onFulfilled function to receive spread arguments
|
|||
|
|
* @return {Promise}
|
|||
|
|
*/
|
|||
|
|
spread: function (onFulfilled) {
|
|||
|
|
return this.then(function (array) {
|
|||
|
|
// array may contain promises, so resolve its contents.
|
|||
|
|
return all(array, function (array) {
|
|||
|
|
return onFulfilled.apply(undef, array);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Create an already-resolved promise for the supplied value
|
|||
|
|
* @private
|
|||
|
|
*
|
|||
|
|
* @param {*} value
|
|||
|
|
* @return {Promise} fulfilled promise
|
|||
|
|
*/
|
|||
|
|
function fulfilled(value) {
|
|||
|
|
var p = new Promise(function (onFulfilled) {
|
|||
|
|
// TODO: Promises/A+ check typeof onFulfilled
|
|||
|
|
try {
|
|||
|
|
return resolve(onFulfilled ? onFulfilled(value) : value);
|
|||
|
|
} catch (e) {
|
|||
|
|
return rejected(e);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return p;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Create an already-rejected {@link Promise} with the supplied
|
|||
|
|
* rejection reason.
|
|||
|
|
* @private
|
|||
|
|
*
|
|||
|
|
* @param {*} reason
|
|||
|
|
* @return {Promise} rejected promise
|
|||
|
|
*/
|
|||
|
|
function rejected(reason) {
|
|||
|
|
var p = new Promise(function (_, onRejected) {
|
|||
|
|
// TODO: Promises/A+ check typeof onRejected
|
|||
|
|
try {
|
|||
|
|
return onRejected ? resolve(onRejected(reason)) : rejected(reason);
|
|||
|
|
} catch (e) {
|
|||
|
|
return rejected(e);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
return p;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Creates a new, Deferred with fully isolated resolver and promise parts,
|
|||
|
|
* either or both of which may be given out safely to consumers.
|
|||
|
|
* The Deferred itself has the full API: resolve, reject, progress, and
|
|||
|
|
* then. The resolver has resolve, reject, and progress. The promise
|
|||
|
|
* only has then.
|
|||
|
|
*
|
|||
|
|
* @return {Deferred}
|
|||
|
|
*/
|
|||
|
|
function defer() {
|
|||
|
|
var deferred, promise, handlers, progressHandlers, _then, _progress, _resolve;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* The promise for the new deferred
|
|||
|
|
* @type {Promise}
|
|||
|
|
*/
|
|||
|
|
promise = new Promise(then);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* The full Deferred object, with {@link Promise} and {@link Resolver} parts
|
|||
|
|
* @class Deferred
|
|||
|
|
* @name Deferred
|
|||
|
|
*/
|
|||
|
|
deferred = {
|
|||
|
|
then: then, // DEPRECATED: use deferred.promise.then
|
|||
|
|
resolve: promiseResolve,
|
|||
|
|
reject: promiseReject,
|
|||
|
|
// TODO: Consider renaming progress() to notify()
|
|||
|
|
progress: promiseProgress,
|
|||
|
|
|
|||
|
|
promise: promise,
|
|||
|
|
|
|||
|
|
resolver: {
|
|||
|
|
resolve: promiseResolve,
|
|||
|
|
reject: promiseReject,
|
|||
|
|
progress: promiseProgress,
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
handlers = [];
|
|||
|
|
progressHandlers = [];
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Pre-resolution then() that adds the supplied callback, errback, and progback
|
|||
|
|
* functions to the registered listeners
|
|||
|
|
* @private
|
|||
|
|
*
|
|||
|
|
* @param {function?} [onFulfilled] resolution handler
|
|||
|
|
* @param {function?} [onRejected] rejection handler
|
|||
|
|
* @param {function?} [onProgress] progress handler
|
|||
|
|
*/
|
|||
|
|
_then = function (onFulfilled, onRejected, onProgress) {
|
|||
|
|
// TODO: Promises/A+ check typeof onFulfilled, onRejected, onProgress
|
|||
|
|
var deferred, progressHandler;
|
|||
|
|
|
|||
|
|
deferred = defer();
|
|||
|
|
|
|||
|
|
progressHandler =
|
|||
|
|
typeof onProgress === "function"
|
|||
|
|
? function (update) {
|
|||
|
|
try {
|
|||
|
|
// Allow progress handler to transform progress event
|
|||
|
|
deferred.progress(onProgress(update));
|
|||
|
|
} catch (e) {
|
|||
|
|
// Use caught value as progress
|
|||
|
|
deferred.progress(e);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
: function (update) {
|
|||
|
|
deferred.progress(update);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
handlers.push(function (promise) {
|
|||
|
|
promise.then(onFulfilled, onRejected).then(deferred.resolve, deferred.reject, progressHandler);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
progressHandlers.push(progressHandler);
|
|||
|
|
|
|||
|
|
return deferred.promise;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Issue a progress event, notifying all progress listeners
|
|||
|
|
* @private
|
|||
|
|
* @param {*} update progress event payload to pass to all listeners
|
|||
|
|
*/
|
|||
|
|
_progress = function (update) {
|
|||
|
|
processQueue(progressHandlers, update);
|
|||
|
|
return update;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Transition from pre-resolution state to post-resolution state, notifying
|
|||
|
|
* all listeners of the resolution or rejection
|
|||
|
|
* @private
|
|||
|
|
* @param {*} value the value of this deferred
|
|||
|
|
*/
|
|||
|
|
_resolve = function (value) {
|
|||
|
|
value = resolve(value);
|
|||
|
|
|
|||
|
|
// Replace _then with one that directly notifies with the result.
|
|||
|
|
_then = value.then;
|
|||
|
|
// Replace _resolve so that this Deferred can only be resolved once
|
|||
|
|
_resolve = resolve;
|
|||
|
|
// Make _progress a noop, to disallow progress for the resolved promise.
|
|||
|
|
_progress = noop;
|
|||
|
|
|
|||
|
|
// Notify handlers
|
|||
|
|
processQueue(handlers, value);
|
|||
|
|
|
|||
|
|
// Free progressHandlers array since we'll never issue progress events
|
|||
|
|
progressHandlers = handlers = undef;
|
|||
|
|
|
|||
|
|
return value;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
return deferred;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Wrapper to allow _then to be replaced safely
|
|||
|
|
* @param {function?} [onFulfilled] resolution handler
|
|||
|
|
* @param {function?} [onRejected] rejection handler
|
|||
|
|
* @param {function?} [onProgress] progress handler
|
|||
|
|
* @return {Promise} new promise
|
|||
|
|
*/
|
|||
|
|
function then(onFulfilled, onRejected, onProgress) {
|
|||
|
|
// TODO: Promises/A+ check typeof onFulfilled, onRejected, onProgress
|
|||
|
|
return _then(onFulfilled, onRejected, onProgress);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Wrapper to allow _resolve to be replaced
|
|||
|
|
*/
|
|||
|
|
function promiseResolve(val) {
|
|||
|
|
return _resolve(val);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Wrapper to allow _reject to be replaced
|
|||
|
|
*/
|
|||
|
|
function promiseReject(err) {
|
|||
|
|
return _resolve(rejected(err));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Wrapper to allow _progress to be replaced
|
|||
|
|
*/
|
|||
|
|
function promiseProgress(update) {
|
|||
|
|
return _progress(update);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Determines if promiseOrValue is a promise or not. Uses the feature
|
|||
|
|
* test from http://wiki.commonjs.org/wiki/Promises/A to determine if
|
|||
|
|
* promiseOrValue is a promise.
|
|||
|
|
*
|
|||
|
|
* @param {*} promiseOrValue anything
|
|||
|
|
* @returns {boolean} true if promiseOrValue is a {@link Promise}
|
|||
|
|
*/
|
|||
|
|
function isPromise(promiseOrValue) {
|
|||
|
|
return promiseOrValue && typeof promiseOrValue.then === "function";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Initiates a competitive race, returning a promise that will resolve when
|
|||
|
|
* howMany of the supplied promisesOrValues have resolved, or will reject when
|
|||
|
|
* it becomes impossible for howMany to resolve, for example, when
|
|||
|
|
* (promisesOrValues.length - howMany) + 1 input promises reject.
|
|||
|
|
*
|
|||
|
|
* @param {Array} promisesOrValues array of anything, may contain a mix
|
|||
|
|
* of promises and values
|
|||
|
|
* @param howMany {number} number of promisesOrValues to resolve
|
|||
|
|
* @param {function?} [onFulfilled] resolution handler
|
|||
|
|
* @param {function?} [onRejected] rejection handler
|
|||
|
|
* @param {function?} [onProgress] progress handler
|
|||
|
|
* @returns {Promise} promise that will resolve to an array of howMany values that
|
|||
|
|
* resolved first, or will reject with an array of (promisesOrValues.length - howMany) + 1
|
|||
|
|
* rejection reasons.
|
|||
|
|
*/
|
|||
|
|
function some(promisesOrValues, howMany, onFulfilled, onRejected, onProgress) {
|
|||
|
|
checkCallbacks(2, arguments);
|
|||
|
|
|
|||
|
|
return when(promisesOrValues, function (promisesOrValues) {
|
|||
|
|
var toResolve, toReject, values, reasons, deferred, fulfillOne, rejectOne, progress, len, i;
|
|||
|
|
|
|||
|
|
len = promisesOrValues.length >>> 0;
|
|||
|
|
|
|||
|
|
toResolve = Math.max(0, Math.min(howMany, len));
|
|||
|
|
values = [];
|
|||
|
|
|
|||
|
|
toReject = len - toResolve + 1;
|
|||
|
|
reasons = [];
|
|||
|
|
|
|||
|
|
deferred = defer();
|
|||
|
|
|
|||
|
|
// No items in the input, resolve immediately
|
|||
|
|
if (!toResolve) {
|
|||
|
|
deferred.resolve(values);
|
|||
|
|
} else {
|
|||
|
|
progress = deferred.progress;
|
|||
|
|
|
|||
|
|
rejectOne = function (reason) {
|
|||
|
|
reasons.push(reason);
|
|||
|
|
if (!--toReject) {
|
|||
|
|
fulfillOne = rejectOne = noop;
|
|||
|
|
deferred.reject(reasons);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
fulfillOne = function (val) {
|
|||
|
|
// This orders the values based on promise resolution order
|
|||
|
|
// Another strategy would be to use the original position of
|
|||
|
|
// the corresponding promise.
|
|||
|
|
values.push(val);
|
|||
|
|
|
|||
|
|
if (!--toResolve) {
|
|||
|
|
fulfillOne = rejectOne = noop;
|
|||
|
|
deferred.resolve(values);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
for (i = 0; i < len; ++i) {
|
|||
|
|
if (i in promisesOrValues) {
|
|||
|
|
when(promisesOrValues[i], fulfiller, rejecter, progress);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return deferred.then(onFulfilled, onRejected, onProgress);
|
|||
|
|
|
|||
|
|
function rejecter(reason) {
|
|||
|
|
rejectOne(reason);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function fulfiller(val) {
|
|||
|
|
fulfillOne(val);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Initiates a competitive race, returning a promise that will resolve when
|
|||
|
|
* any one of the supplied promisesOrValues has resolved or will reject when
|
|||
|
|
* *all* promisesOrValues have rejected.
|
|||
|
|
*
|
|||
|
|
* @param {Array|Promise} promisesOrValues array of anything, may contain a mix
|
|||
|
|
* of {@link Promise}s and values
|
|||
|
|
* @param {function?} [onFulfilled] resolution handler
|
|||
|
|
* @param {function?} [onRejected] rejection handler
|
|||
|
|
* @param {function?} [onProgress] progress handler
|
|||
|
|
* @returns {Promise} promise that will resolve to the value that resolved first, or
|
|||
|
|
* will reject with an array of all rejected inputs.
|
|||
|
|
*/
|
|||
|
|
function any(promisesOrValues, onFulfilled, onRejected, onProgress) {
|
|||
|
|
function unwrapSingleResult(val) {
|
|||
|
|
return onFulfilled ? onFulfilled(val[0]) : val[0];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return some(promisesOrValues, 1, unwrapSingleResult, onRejected, onProgress);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Return a promise that will resolve only once all the supplied promisesOrValues
|
|||
|
|
* have resolved. The resolution value of the returned promise will be an array
|
|||
|
|
* containing the resolution values of each of the promisesOrValues.
|
|||
|
|
* @memberOf when
|
|||
|
|
*
|
|||
|
|
* @param {Array|Promise} promisesOrValues array of anything, may contain a mix
|
|||
|
|
* of {@link Promise}s and values
|
|||
|
|
* @param {function?} [onFulfilled] resolution handler
|
|||
|
|
* @param {function?} [onRejected] rejection handler
|
|||
|
|
* @param {function?} [onProgress] progress handler
|
|||
|
|
* @returns {Promise}
|
|||
|
|
*/
|
|||
|
|
function all(promisesOrValues, onFulfilled, onRejected, onProgress) {
|
|||
|
|
checkCallbacks(1, arguments);
|
|||
|
|
return map(promisesOrValues, identity).then(onFulfilled, onRejected, onProgress);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Joins multiple promises into a single returned promise.
|
|||
|
|
* @return {Promise} a promise that will fulfill when *all* the input promises
|
|||
|
|
* have fulfilled, or will reject when *any one* of the input promises rejects.
|
|||
|
|
*/
|
|||
|
|
function join(/* ...promises */) {
|
|||
|
|
return map(arguments, identity);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Traditional map function, similar to `Array.prototype.map()`, but allows
|
|||
|
|
* input to contain {@link Promise}s and/or values, and mapFunc may return
|
|||
|
|
* either a value or a {@link Promise}
|
|||
|
|
*
|
|||
|
|
* @param {Array|Promise} promise array of anything, may contain a mix
|
|||
|
|
* of {@link Promise}s and values
|
|||
|
|
* @param {function} mapFunc mapping function mapFunc(value) which may return
|
|||
|
|
* either a {@link Promise} or value
|
|||
|
|
* @returns {Promise} a {@link Promise} that will resolve to an array containing
|
|||
|
|
* the mapped output values.
|
|||
|
|
*/
|
|||
|
|
function map(promise, mapFunc) {
|
|||
|
|
return when(promise, function (array) {
|
|||
|
|
var results, len, toResolve, resolve, i, d;
|
|||
|
|
|
|||
|
|
// Since we know the resulting length, we can preallocate the results
|
|||
|
|
// array to avoid array expansions.
|
|||
|
|
toResolve = len = array.length >>> 0;
|
|||
|
|
results = [];
|
|||
|
|
d = defer();
|
|||
|
|
|
|||
|
|
if (!toResolve) {
|
|||
|
|
d.resolve(results);
|
|||
|
|
} else {
|
|||
|
|
resolve = function resolveOne(item, i) {
|
|||
|
|
when(item, mapFunc).then(function (mapped) {
|
|||
|
|
results[i] = mapped;
|
|||
|
|
|
|||
|
|
if (!--toResolve) {
|
|||
|
|
d.resolve(results);
|
|||
|
|
}
|
|||
|
|
}, d.reject);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// Since mapFunc may be async, get all invocations of it into flight
|
|||
|
|
for (i = 0; i < len; i++) {
|
|||
|
|
if (i in array) {
|
|||
|
|
resolve(array[i], i);
|
|||
|
|
} else {
|
|||
|
|
--toResolve;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return d.promise;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Traditional reduce function, similar to `Array.prototype.reduce()`, but
|
|||
|
|
* input may contain promises and/or values, and reduceFunc
|
|||
|
|
* may return either a value or a promise, *and* initialValue may
|
|||
|
|
* be a promise for the starting value.
|
|||
|
|
*
|
|||
|
|
* @param {Array|Promise} promise array or promise for an array of anything,
|
|||
|
|
* may contain a mix of promises and values.
|
|||
|
|
* @param {function} reduceFunc reduce function reduce(currentValue, nextValue, index, total),
|
|||
|
|
* where total is the total number of items being reduced, and will be the same
|
|||
|
|
* in each call to reduceFunc.
|
|||
|
|
* @returns {Promise} that will resolve to the final reduced value
|
|||
|
|
*/
|
|||
|
|
function reduce(promise, reduceFunc /*, initialValue */) {
|
|||
|
|
var args = slice.call(arguments, 1);
|
|||
|
|
|
|||
|
|
return when(promise, function (array) {
|
|||
|
|
var total;
|
|||
|
|
|
|||
|
|
total = array.length;
|
|||
|
|
|
|||
|
|
// Wrap the supplied reduceFunc with one that handles promises and then
|
|||
|
|
// delegates to the supplied.
|
|||
|
|
args[0] = function (current, val, i) {
|
|||
|
|
return when(current, function (c) {
|
|||
|
|
return when(val, function (value) {
|
|||
|
|
return reduceFunc(c, value, i, total);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
return reduceArray.apply(array, args);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Ensure that resolution of promiseOrValue will trigger resolver with the
|
|||
|
|
* value or reason of promiseOrValue, or instead with resolveValue if it is provided.
|
|||
|
|
*
|
|||
|
|
* @param promiseOrValue
|
|||
|
|
* @param {Object} resolver
|
|||
|
|
* @param {function} resolver.resolve
|
|||
|
|
* @param {function} resolver.reject
|
|||
|
|
* @param {*} [resolveValue]
|
|||
|
|
* @returns {Promise}
|
|||
|
|
*/
|
|||
|
|
function chain(promiseOrValue, resolver, resolveValue) {
|
|||
|
|
var useResolveValue = arguments.length > 2;
|
|||
|
|
|
|||
|
|
return when(
|
|||
|
|
promiseOrValue,
|
|||
|
|
function (val) {
|
|||
|
|
val = useResolveValue ? resolveValue : val;
|
|||
|
|
resolver.resolve(val);
|
|||
|
|
return val;
|
|||
|
|
},
|
|||
|
|
function (reason) {
|
|||
|
|
resolver.reject(reason);
|
|||
|
|
return rejected(reason);
|
|||
|
|
},
|
|||
|
|
resolver.progress
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// Utility functions
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Apply all functions in queue to value
|
|||
|
|
* @param {Array} queue array of functions to execute
|
|||
|
|
* @param {*} value argument passed to each function
|
|||
|
|
*/
|
|||
|
|
function processQueue(queue, value) {
|
|||
|
|
var handler,
|
|||
|
|
i = 0;
|
|||
|
|
|
|||
|
|
while ((handler = queue[i++])) {
|
|||
|
|
handler(value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Helper that checks arrayOfCallbacks to ensure that each element is either
|
|||
|
|
* a function, or null or undefined.
|
|||
|
|
* @private
|
|||
|
|
* @param {number} start index at which to start checking items in arrayOfCallbacks
|
|||
|
|
* @param {Array} arrayOfCallbacks array to check
|
|||
|
|
* @throws {Error} if any element of arrayOfCallbacks is something other than
|
|||
|
|
* a functions, null, or undefined.
|
|||
|
|
*/
|
|||
|
|
function checkCallbacks(start, arrayOfCallbacks) {
|
|||
|
|
// TODO: Promises/A+ update type checking and docs
|
|||
|
|
var arg,
|
|||
|
|
i = arrayOfCallbacks.length;
|
|||
|
|
|
|||
|
|
while (i > start) {
|
|||
|
|
arg = arrayOfCallbacks[--i];
|
|||
|
|
|
|||
|
|
if (arg != null && typeof arg != "function") {
|
|||
|
|
throw new Error("arg " + i + " must be a function");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* No-Op function used in method replacement
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
function noop() {}
|
|||
|
|
|
|||
|
|
slice = [].slice;
|
|||
|
|
|
|||
|
|
// ES5 reduce implementation if native not available
|
|||
|
|
// See: http://es5.github.com/#x15.4.4.21 as there are many
|
|||
|
|
// specifics and edge cases.
|
|||
|
|
reduceArray =
|
|||
|
|
[].reduce ||
|
|||
|
|
function (reduceFunc /*, initialValue */) {
|
|||
|
|
/*jshint maxcomplexity: 7*/
|
|||
|
|
|
|||
|
|
// ES5 dictates that reduce.length === 1
|
|||
|
|
|
|||
|
|
// This implementation deviates from ES5 spec in the following ways:
|
|||
|
|
// 1. It does not check if reduceFunc is a Callable
|
|||
|
|
|
|||
|
|
var arr, args, reduced, len, i;
|
|||
|
|
|
|||
|
|
i = 0;
|
|||
|
|
// This generates a jshint warning, despite being valid
|
|||
|
|
// "Missing 'new' prefix when invoking a constructor."
|
|||
|
|
// See https://github.com/jshint/jshint/issues/392
|
|||
|
|
arr = Object(this);
|
|||
|
|
len = arr.length >>> 0;
|
|||
|
|
args = arguments;
|
|||
|
|
|
|||
|
|
// If no initialValue, use first item of array (we know length !== 0 here)
|
|||
|
|
// and adjust i to start at second item
|
|||
|
|
if (args.length <= 1) {
|
|||
|
|
// Skip to the first real element in the array
|
|||
|
|
for (;;) {
|
|||
|
|
if (i in arr) {
|
|||
|
|
reduced = arr[i++];
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// If we reached the end of the array without finding any real
|
|||
|
|
// elements, it's a TypeError
|
|||
|
|
if (++i >= len) {
|
|||
|
|
throw new TypeError();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
// If initialValue provided, use it
|
|||
|
|
reduced = args[1];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Do the actual reduce
|
|||
|
|
for (; i < len; ++i) {
|
|||
|
|
// Skip holes
|
|||
|
|
if (i in arr) {
|
|||
|
|
reduced = reduceFunc(reduced, arr[i], i, arr);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return reduced;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
function identity(x) {
|
|||
|
|
return x;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return when;
|
|||
|
|
});
|
|||
|
|
})(
|
|||
|
|
function (factory) {
|
|||
|
|
module.exports = factory();
|
|||
|
|
}
|
|||
|
|
// Boilerplate for AMD, Node, and browser global
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
//兼容v1.92版本以前的cesium
|
|||
|
|
Cesium.when= Cesium.when||{}
|
|||
|
|
Cesium.when.defer = when.defer;
|
|||
|
|
Cesium.when = when
|
|||
|
|
Cesium.defer = when.defer;
|
|||
|
|
|
|||
|
|
//兼容1.92以后的cesium相关插件
|
|||
|
|
Promise.prototype.otherwise = Promise.prototype.catch;
|
|||
|
|
Promise.prototype.always = Promise.prototype.finally;
|