Exemplo n.º 1
0
            public ResolveResultDTO <DataType> GetStoredEntityAsResolveResult(ResolveRequestDTO req)
            {
                if (string.IsNullOrEmpty(req.key))
                {
                    return(ResolveResultDTO <DataType> .ResolveError(
                               req, "null or empty key"
                               ));
                }
                var store = Services.Require <HasEntities <DataType> >();
                Entity <DataType> entity;

                if (!store.GetEntity(req.key, out entity) || !entity.status.hasResolved)
                {
                    return(string.IsNullOrEmpty(entity.status.resolveError) ?
                           ResolveResultDTO <DataType> .ResolveNotFound(req) :
                           ResolveResultDTO <DataType> .ResolveError(
                               req, entity.status.resolveError
                               ));
                }
                var status = entity.status;

                return(ResolveResultDTO <DataType> .ResolveSucceeded(
                           req, entity.id, entity.data, status.maxAgeSecs, status.timestamp
                           ));
            }
Exemplo n.º 2
0
        /// <summary>
        /// Allows you to request an entity (from the store) and get a callback when load succeeds or fails.
        /// If the entity is not initially loaded, sends the usual notifications and then listens for updates
        /// </summary>
        public static Request <ResolveMultipleResultDTO <DataType> > ResolveAll(
            IEnumerable <string> keys,
            HasEntities <DataType> store,
            Action <Request <ResolveMultipleResultDTO <DataType> > > callback = null)
        {
            var promise = new Promise <ResolveMultipleResultDTO <DataType> >((resolve, reject, cancel, attach) =>
            {
                var all = new JoinRequests();
                foreach (var k in keys)
                {
                    all.Add(new DataRequest(NewResolveRequest(k), store));
                }
                all.Execute(result =>
                {
                    var allResult = result as JoinRequests;
                    using (var resultRequests = ListPool <Request> .Get())
                        using (var resultItems = ListPool <ResolveResultDTO <DataType> > .Get())
                        {
                            allResult.GetResults(resultRequests);
                            foreach (var rr in resultRequests)
                            {
                                var key    = (rr as DataRequest).loadKey;
                                var reqDTO = (rr as DataRequest).requestDTO;
                                if (rr.hasError)
                                {
                                    resultItems.Add(
                                        ResolveResultDTO <DataType> .ResolveError(
                                            reqDTO, rr.error
                                            )
                                        );
                                    continue;
                                }
                                Entity <DataType> entity;
                                if (!store.GetEntity(key, out entity))
                                {
                                    resultItems.Add(
                                        ResolveResultDTO <DataType> .ResolveError(
                                            reqDTO,
                                            "enity not in store after resolve"
                                            )
                                        );
                                    continue;
                                }
                                var status = entity.status;
                                resultItems.Add(ResolveResultDTO <DataType> .ResolveSucceeded(
                                                    reqDTO, entity.id, entity.data, status.maxAgeSecs, status.timestamp
                                                    ));
                            }
                            resolve(new ResolveMultipleResultDTO <DataType>
                            {
                                entities = resultItems.ToArray()
                            });
                        }
                });
            });

            promise.Execute(callback);
            return(promise);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Resolve the data and metadata for a key from an async method using await.
        /// NOTE: this method will return a ResolveResult<DataType> even if the item
        /// fails to load, e.g. either not found or resolve error.
        /// Use this version if you want to handle failed responses without try/catch.
        /// If you'd rather an exception be thrown any time the data isn't available,
        /// use @see ResolveOrThrowAsync.
        /// </summary>
        /// <returns>The async.</returns>
        public static async System.Threading.Tasks.Task <ResolveResultDTO <DataType> > ResolveAsync(
            string loadKey,
            HasEntities <DataType> store)
        {
            var req = NewResolveRequest(loadKey);

            if (string.IsNullOrEmpty(loadKey))
            {
                return(ResolveResultDTO <DataType> .ResolveError(
                           req,
                           "Load key cannot be null or empty"
                           ));
            }
            var r = new ResolveResultRequest(req, store);

            try
            {
                await r.ExecuteAsync();

                return(r.item);
            }
            catch (Exception e)
            {
#if UNITY_EDITOR || DEBUG_UNSTRIP
                var ae = e as AggregateException;
                if (ae != null)
                {
                    foreach (var ie in ae.InnerExceptions)
                    {
                        Debug.LogError("error on execute async for type "
                                       + typeof(DataType).Name
                                       + " and load key '" + loadKey
                                       + ": " + ie.Message
                                       + "\n" + ie.StackTrace
                                       );
                    }
                }
                else
                {
                    Debug.LogError("error on execute async for type "
                                   + typeof(DataType).Name
                                   + " and load key '" + loadKey
                                   + ": " + e.Message
                                   );
                }
#endif
                return(ResolveResultDTO <DataType> .ResolveError(
                           req, e.Message
                           ));
            }
        }
Exemplo n.º 4
0
            private void OnStoreUpdate(string id)
            {
                if (id != this.loadKey)
                {
                    return;
                }
                Entity <DataType> entity;

                if (!store.GetEntity(this.loadKey, out entity))
                {
                    var err = "entity not tracked in store (expected in progress or complete)";
                    this.item = ResolveResultDTO <DataType> .ResolveError(
                        this.requestDTO, err
                        );

                    CompleteWithError(err);
                    return;
                }
                ResolveStatus stat = entity.status;

                if (stat.isResolveInProgress)
                {
                    return;
                }
                if (!stat.hasResolved)
                {
                    var err = stat.resolveError ?? "not found";
                    this.item = ResolveResultDTO <DataType> .ResolveError(
                        this.requestDTO, err
                        );

                    CompleteWithError(err);
                    return;
                }
                this.item = ResolveResultDTO <DataType> .ResolveSucceeded(
                    this.requestDTO, entity.id, entity.data,
                    stat.maxAgeSecs, stat.timestamp
                    );

                CompleteRequest();
            }