Add Promise to make async programming easier
#1145 byMicrosoftwas closed 5 seconds ago · Review required
对于Js的Promise
书写十分的清晰,使用起来也很方便
new Promise((resolve,reject)=>{
if(Condition){
resolve(result);
}else{
reject('Some error happened');
}
}).then( r => { continueToDo(r); })
.catch( e => { dealWithError(e); })
有什么办法能在C#中也用这种写法呢,微软你快想想办法:
微软 :
”Task.Run 还有 ContinueWith 不会用吗你食不食油饼“
“我们会对您的病情进行持续的跟踪”
直接端上来罢
public class Promise<T>
{
public Promise(Action<Action<T>,Action<string>> action)
{
onResolve = result => Result = result;
Task.Run(() => action(r => onResolve?.Invoke(r), e => onReject?.Invoke(new Exception(e))));
}
public T? Result { get; private set; }
#region private fields
delegate void ResolveEvent(T result);
delegate void RejectEvent(Exception exception);
private ResolveEvent? onResolve;
private RejectEvent? onReject;
#endregion
public Promise<T> Then(Action<T> then)
{
onResolve += r => then(r);
return this;
}
public Promise<T> Catch(Action<Exception> exception)
{
onReject += e => exception(e);
return this;
}
}
调用如下:
new Promise<bool>(((resolve, reject) =>
{
if (Condition)
{
resolve(true);//return;
}
else
{
reject("Some error happened");//return;
}
})).Then(r => ContinueToDo(r) )
.Catch(e => DealWithError(e) );
你说得对,但问题是回调归回调,如果在循环中,他们都不会得到退出,导致事件被频繁的触发。
所以你需要:
resolve(...); return;
reject(...); return;