Added Promise<T>.Then(Action<T>..)
ln.build - build0.waldrennach.l--n.de build job pending Details

master 0.2.1
Harald Wolff 2020-12-30 12:52:38 +01:00
parent e4f4989ea2
commit 12e7e8bd10
3 changed files with 56 additions and 1 deletions

View File

@ -34,6 +34,9 @@ namespace ln.threading.tests
.Then((value)=>{
return value + 1;
})
.Then((value)=>{
value ++;
})
.Value
);
@ -57,6 +60,9 @@ namespace ln.threading.tests
.Then((value)=>{
return value + 1;
})
.Then((value)=>{
value ++;
})
.Value
);
}

View File

@ -151,6 +151,55 @@ namespace ln.threading
}
}
public Promise<T> Then(Action<T> resolved) => Then(resolved, null);
public Promise<T> Then(Action<T> resolved, Func<Exception,T> rejected)
{
lock (this)
{
Promise<T> chainedPromise = new Promise<T>();
Action resolveAction = ()=>{
lock (this)
{
switch (State)
{
case PromiseState.PENDING:
throw new Exception("serious bug in Promise.Then(..)");
case PromiseState.RESOLVED:
try{
resolved(value);
chainedPromise.Resolve(value);
} catch (Exception e)
{
chainedPromise.Reject(e);
}
break;
case PromiseState.REJECTED:
if (rejected == null)
chainedPromise.Reject(rejectingException);
else
{
try{
chainedPromise.Resolve(rejected(rejectingException));
} catch (Exception e)
{
chainedPromise.Reject(e);
}
}
break;
}
}
};
if (IsSettled)
DynamicThreadPool.DefaultPool.Enqueue(resolveAction);
else
Settled += (p) => resolveAction();
return chainedPromise;
}
}
public Promise<T> Catch(Func<Exception,T> rejectedHandler)
{
lock (this)

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<Version>0.2.0</Version>
<Version>0.2.1</Version>
<Authors>Harald Wolff-Thobaben</Authors>
<Company>l--n.de</Company>
<Description />