public class Promise<PromisedT>
private Action<PromisedT> onResolved;
private Action<string> onRejected;
value = default(PromisedT);
public void Resolve(PromisedT successValue)
if (status == Status.PENDING)
status = Status.RESOLVED;
onResolved?.Invoke(value);
Reject("Default promise rejection message");
public void Reject(string message)
if (status == Status.PENDING)
status = Status.REJECTED;
onRejected?.Invoke(message);
public Promise<PromisedT> Catch(Action callback)
return Catch((msg) => callback());
public Promise<PromisedT> Catch(Action<string> callback)
Promise<PromisedT> promise = new Promise<PromisedT>();
if (status == Status.PENDING)
onResolved = (PromisedT val) => promise.Resolve(val);
else if (status == Status.RESOLVED)
callback("Default promise rejection message");
public Promise<bool> Then(Action callback)
return Then((PromisedT val) =>
public Promise<bool> Then(Action<PromisedT> callback)
return Then((PromisedT val) =>
public Promise<ConvertT> Then<ConvertT>(Func<PromisedT, ConvertT> callback)
Promise<ConvertT> promise = new Promise<ConvertT>();
Action<PromisedT> initPromiseResolution = (PromisedT val) =>
ConvertT callbackValue = callback(val);
promise.Resolve(callbackValue);
if (status == Status.PENDING)
onResolved = initPromiseResolution;
onRejected = (string msg) => promise.Reject(msg);
else if (status == Status.RESOLVED)
initPromiseResolution(value);
public Promise<ConvertT> Then<ConvertT>(Func<PromisedT, Promise<ConvertT>> callback)
Promise<ConvertT> promise = new Promise<ConvertT>();
Action<PromisedT> initPromiseResolution = (PromisedT val) =>
Promise<ConvertT> callbackPromise = callback(val);
callbackPromise.Then((ConvertT callbackVal) => promise.Resolve(callbackVal));
if (status == Status.PENDING)
onResolved = initPromiseResolution;
onRejected = (string msg) => promise.Reject(msg);
else if (status == Status.RESOLVED)
initPromiseResolution(value);
public static void Main()
Promise<string> promise = new Promise<string>();
promise.Then(r => System.Console.Write(r));