예제 #1
0
        public IPromise Catch(Predicate <RejectReason> match, Func <RejectReason, IPromise> recover)
        {
            var deferred = new Deferred();

            AssignDisposer(deferred, Disposer);

            Done(() =>
            {
                deferred.Resolve();
            });

            Fail(error =>
            {
                if (match(error))
                {
                    var promise = recover(error);

                    AssignDisposer((BaseDeferred)promise, Disposer);

                    promise.Done(() => deferred.Resolve());
                    promise.Fail(e => deferred.Reject(e));
                }
                else
                {
                    deferred.Reject(error);
                }
            });

            return(deferred);
        }
예제 #2
0
        //First will be Resolved, others well be Reseted
        public static IPromise Race(params IPromise[] collection)
        {
            var race     = new Deferred();
            var promises = Array.ConvertAll(collection, promice => promice as BaseDeferred);

            BaseDeferred last = null;

            for (int i = 0; i < promises.Length; i++)
            {
                var promise = promises[i];

                last = promise;
                var self = promise;

                if (IsResolved(last))
                {
                    break;
                }

                promise.Done(() =>
                {
                    for (int j = 0; j < promises.Length; j++)
                    {
                        var item = promises[j];

                        if (IsPending(item) && item != self) // TODO: item != self is always true because done
                        {
                            Reset(item);
                        }
                    }

                    race.Resolve();
                });

                promise.Fail(() =>
                {
                    if (promises.All(p => IsRejected(p)))
                    {
                        race.Reject();
                    }
                });
            }

            if (IsResolved(last))
            {
                for (int i = 0; i < promises.Length; i++)
                {
                    var item = promises[i];

                    if (IsPending(item) && item != last)
                    {
                        Reset(item);
                    }
                }

                race.Resolve();
            }

            return(race);
        }
예제 #3
0
        public static IPromise All(params IPromise[] collection)
        {
            var deferred = new Deferred();
            var promises = Array.ConvertAll(collection, promice => promice as BaseDeferred);

            if (collection.Length == 0)
            {
                deferred.Resolve();
            }

            for (int i = 0; i < promises.Length; i++)
            {
                var promise = promises[i];
                promise.Done(() =>
                {
                    if (deferred.State == Status.Pending && promises.All(p => IsResolved(p)))
                    {
                        deferred.Resolve();
                    }
                });

                promise.Fail(() =>
                {
                    if (deferred.State == Status.Pending)
                    {
                        deferred.Reject();
                    }
                });
            }

            return(deferred);
        }
예제 #4
0
        public IPromise Clone()
        {
            var clone = new Deferred();

            AssignDisposer(clone, Disposer);

            Done(() => clone.Resolve());
            Fail(() => clone.Reject());

            return(clone);
        }
예제 #5
0
        public IPromise AddDisposer(IDisposer disposer)
        {
            var deferred = new Deferred();

            AssignDisposer(deferred, disposer);

            Done(() => deferred.Resolve());
            Fail(() => deferred.Reject());

            return(deferred);
        }
예제 #6
0
        public IPromise <TNext> Then <TNext>(Func <IPromise <TNext> > next)
        {
            var deferred = new Deferred <TNext>();

            AssignDisposer(deferred, Disposer);

            Done(() =>
            {
                var promise = next();

                AssignDisposer((BaseDeferred)promise, Disposer);

                promise.Done(res => deferred.Resolve(res));
                promise.Fail(() => deferred.Reject());
            });

            Fail(() => deferred.Reject());

            return(deferred);
        }