C# 复刻 Js Promise [Closed]

Add Promise to make async programming easier
#1145 by Microsoft was 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值