123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748 |
- (function(define) { 'use strict';
- define(function () {
- var reduceArray, slice, undef;
-
-
-
- when.defer = defer;
- when.resolve = resolve;
- when.reject = reject;
- when.join = join;
- when.all = all;
- when.map = map;
- when.reduce = reduce;
- when.any = any;
- when.some = some;
- when.chain = chain;
- when.isPromise = isPromise;
-
- function when(promiseOrValue, onFulfilled, onRejected, onProgress) {
-
-
- return resolve(promiseOrValue).then(onFulfilled, onRejected, onProgress);
- }
-
- function resolve(promiseOrValue) {
- var promise, deferred;
- if(promiseOrValue instanceof Promise) {
-
- promise = promiseOrValue;
- } else {
-
- if(isPromise(promiseOrValue)) {
-
-
- deferred = defer();
-
-
- promiseOrValue.then(
- function(value) { deferred.resolve(value); },
- function(reason) { deferred.reject(reason); },
- function(update) { deferred.progress(update); }
- );
- promise = deferred.promise;
- } else {
-
- promise = fulfilled(promiseOrValue);
- }
- }
- return promise;
- }
-
- function reject(promiseOrValue) {
- return when(promiseOrValue, rejected);
- }
-
- function Promise(then) {
- this.then = then;
- }
- Promise.prototype = {
-
- always: function(onFulfilledOrRejected, onProgress) {
- return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress);
- },
-
- otherwise: function(onRejected) {
- return this.then(undef, onRejected);
- },
-
- yield: function(value) {
- return this.then(function() {
- return value;
- });
- },
-
- spread: function(onFulfilled) {
- return this.then(function(array) {
-
- return all(array, function(array) {
- return onFulfilled.apply(undef, array);
- });
- });
- }
- };
-
- function fulfilled(value) {
- var p = new Promise(function(onFulfilled) {
-
- try {
- return resolve(onFulfilled ? onFulfilled(value) : value);
- } catch(e) {
- return rejected(e);
- }
- });
- return p;
- }
-
- function rejected(reason) {
- var p = new Promise(function(_, onRejected) {
-
- try {
- return onRejected ? resolve(onRejected(reason)) : rejected(reason);
- } catch(e) {
- return rejected(e);
- }
- });
- return p;
- }
-
- function defer() {
- var deferred, promise, handlers, progressHandlers,
- _then, _progress, _resolve;
-
- promise = new Promise(then);
-
- deferred = {
- then: then,
- resolve: promiseResolve,
- reject: promiseReject,
-
- progress: promiseProgress,
- promise: promise,
- resolver: {
- resolve: promiseResolve,
- reject: promiseReject,
- progress: promiseProgress
- }
- };
- handlers = [];
- progressHandlers = [];
-
- _then = function(onFulfilled, onRejected, onProgress) {
-
- var deferred, progressHandler;
- deferred = defer();
- progressHandler = typeof onProgress === 'function'
- ? function(update) {
- try {
-
- deferred.progress(onProgress(update));
- } catch(e) {
-
- 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;
- };
-
- _progress = function(update) {
- processQueue(progressHandlers, update);
- return update;
- };
-
- _resolve = function(value) {
- value = resolve(value);
-
- _then = value.then;
-
- _resolve = resolve;
-
- _progress = noop;
-
- processQueue(handlers, value);
-
- progressHandlers = handlers = undef;
- return value;
- };
- return deferred;
-
- function then(onFulfilled, onRejected, onProgress) {
-
- return _then(onFulfilled, onRejected, onProgress);
- }
-
- function promiseResolve(val) {
- return _resolve(val);
- }
-
- function promiseReject(err) {
- return _resolve(rejected(err));
- }
-
- function promiseProgress(update) {
- return _progress(update);
- }
- }
-
- function isPromise(promiseOrValue) {
- return promiseOrValue && typeof promiseOrValue.then === 'function';
- }
-
- 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();
-
- 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) {
-
-
-
- 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);
- }
- });
- }
-
- function any(promisesOrValues, onFulfilled, onRejected, onProgress) {
- function unwrapSingleResult(val) {
- return onFulfilled ? onFulfilled(val[0]) : val[0];
- }
- return some(promisesOrValues, 1, unwrapSingleResult, onRejected, onProgress);
- }
-
- function all(promisesOrValues, onFulfilled, onRejected, onProgress) {
- checkCallbacks(1, arguments);
- return map(promisesOrValues, identity).then(onFulfilled, onRejected, onProgress);
- }
-
- function join(/* ...promises */) {
- return map(arguments, identity);
- }
-
- function map(promise, mapFunc) {
- return when(promise, function(array) {
- var results, len, toResolve, resolve, i, d;
-
-
- 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);
- };
-
- for(i = 0; i < len; i++) {
- if(i in array) {
- resolve(array[i], i);
- } else {
- --toResolve;
- }
- }
- }
- return d.promise;
- });
- }
-
- function reduce(promise, reduceFunc /*, initialValue */) {
- var args = slice.call(arguments, 1);
- return when(promise, function(array) {
- var total;
- total = array.length;
-
-
- 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);
- });
- }
-
- 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
- );
- }
-
-
-
-
- function processQueue(queue, value) {
- var handler, i = 0;
- while (handler = queue[i++]) {
- handler(value);
- }
- }
-
- function checkCallbacks(start, arrayOfCallbacks) {
-
- 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');
- }
- }
- }
-
- function noop() {}
- slice = [].slice;
-
-
-
- reduceArray = [].reduce ||
- function(reduceFunc /*, initialValue */) {
-
-
-
-
- var arr, args, reduced, len, i;
- i = 0;
-
-
-
- arr = Object(this);
- len = arr.length >>> 0;
- args = arguments;
-
-
- if(args.length <= 1) {
-
- for(;;) {
- if(i in arr) {
- reduced = arr[i++];
- break;
- }
-
-
- if(++i >= len) {
- throw new TypeError();
- }
- }
- } else {
-
- reduced = args[1];
- }
-
- for(;i < len; ++i) {
-
- if(i in arr) {
- reduced = reduceFunc(reduced, arr[i], i, arr);
- }
- }
- return reduced;
- };
- function identity(x) {
- return x;
- }
- return when;
- });
- })(typeof define == 'function' && define.amd
- ? define
- : function (factory) { typeof exports === 'object'
- ? (module.exports = factory())
- : (this.when = factory());
- }
-
- );
|