异步函数传染性

        在 JavaScript 中,异步函数的传染性指的是当一个函数内部包含异步操作(例如使用了 Promise、async/await 等)时,它会将异步特性传递给调用它的函数,以及调用它们的函数,依次传递下去。这可能会导致整个调用链上的函数都需要处理异步操作。

考虑以下示例:

async function getUser() {
  return await fetch('./data.json').then((res) => res.json());
}
async function m1() {
  return await getUser();
}
async function m2() {
  return await m1();
}
async function m3() {
  return await m2();
}
async function main() {
  const user = await m3();
  console.log(user)
}
main();

在业务场景中为了解决这个问题,可以使用以下函数,其原理是:使用报异常的方式终止代码继续运行,在异常结束之后获取上吃抛异常时得到的接口请求数据重新执行一遍函数。

由于针对的是纯函数,进参相同,结果也相同,所以无需担心执行后出现副作用。

function getUser() {
  return fetch('./data.json')
}
function m1() {
  return getUser();
}
function m2() {
  return m1();
}
function m3() {
  return m2();
}
function main() {
  const user = m3()
  console.log(user)
}

//改变fetch函数的行为
function run(func) {
  let cache = [];//存储缓存结果;
  let i = 0;//表示第几次调用fetch
  const _originalFetch = window.fetch;
  window.fetch = (...args) => {
    //有缓存的话就交付缓存结果
    if (cache[i]) {
      if (cache[i].status === 'fulfilled') {
        return cache[i].data;
      }
      else if (cache[i].status === 'rejected') {
        throw cache[i].err;
      }
    }
    //没有缓存就定一个,加到缓存中
    const result = {
      status: 'padding',
      data: null,
      err: null
    };
    cache[i++] = result;
    //发送情求
    const prom = _originalFetch(...args).then(res => res.json()).then(
      res => {
        result.status = 'fulfilled';
        result.data = res;
        console.log("res--->", res)
      }, err => {
        result.status = 'rejected';
        result.data = err;
        console.log("err--->", err)
      }
    )
    //报错
    throw prom;
  };
  try {
    func()
  } catch (err) {
    //TODO handle the exception
    if (err instanceof Promise) {
      const reRun = () => {
        i = 0;
        func();
      }
      err.then(reRun, reRun);
    }
  }

}
run(main);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中,可以通过使用异步和等待(async/await)来消除异步的传染。异步的传染性是指当一个方法是异步的时,调用该方法的方法也必须是异步的,并且这个过程会一直传递下去。为了消除异步的传染性,可以使用以下四种方法: 1. 异步委托:定义一个与需要调用的方法具有相同签名的委托,并使用异步关键字修饰该委托,然后通过调用委托的BeginInvoke和EndInvoke方法来实现异步调用。 2. Task类:使用Task类来执行异步操作。可以使用Task.Run方法来启动一个新的任务,并使用await关键字等待任务的完成。 3. async/await:使用async/await关键字来标记方法为异步,并使用await关键字等待异步操作的完成。在异步方法中,可以使用await关键字等待另一个异步方法的完成,而无需标记该方法为异步。 4. 异步迭代器:使用yield关键字和IAsyncEnumerable/IAsyncEnumerator接口来创建异步迭代器方法。在异步迭代器方法中,可以使用await关键字和yield return语句来返回异步生成的元素。 通过使用以上四种方法,可以在C#中有效地消除异步的传染性,使得只有需要异步处理的方法才是异步的,而其他方法可以继续以同步方式调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C#异步调用四大方法](https://download.csdn.net/download/weixin_38707862/13757502)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [c#入门-异步方法](https://blog.csdn.net/zms9110750/article/details/128810315)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值