Example #1
0
        void _prependListeners(_FutureListener listeners)
        {
            if (listeners == null)
            {
                return;
            }
            if (_mayAddListener)
            {
                _FutureListener existingListeners = (_FutureListener)_resultOrListeners;
                _resultOrListeners = listeners;
                if (existingListeners != null)
                {
                    _FutureListener cursor = listeners;
                    while (cursor._nextListener != null)
                    {
                        cursor = cursor._nextListener;
                    }

                    cursor._nextListener = existingListeners;
                }
            }
            else
            {
                if (_isChained)
                {
                    // Delegate listeners to chained source future.
                    // If the source is complete, instead copy its values and
                    // drop the chaining.
                    _Future source = _chainSource;
                    if (!source._isComplete)
                    {
                        source._prependListeners(listeners);
                        return;
                    }

                    _cloneResult(source);
                }

                D.assert(_isComplete);
                listeners = _reverseListeners(listeners);
                _zone.scheduleMicrotask(() => {
                    _propagateToListeners(this, listeners);
                    return(null);
                });
            }
        }
Example #2
0
        static void _chainCoreFuture(_Future source, _Future target)
        {
            D.assert(target._mayAddListener); // Not completed, not already chained.
            while (source._isChained)
            {
                source = source._chainSource;
            }

            if (source._isComplete)
            {
                _FutureListener listeners = target._removeListeners();
                target._cloneResult(source);
                _propagateToListeners(target, listeners);
            }
            else
            {
                _FutureListener listeners = (_FutureListener)target._resultOrListeners;
                target._setChained(source);
                source._prependListeners(listeners);
            }
        }