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 )); }
/// <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); }
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(); }