从函数调用栈到洋葱模型到CO再到redux-saga

294 阅读2分钟

祸起萧墙:Axios 拦截器

  1. 很早以前看项目中的封装的axios时,发现拦截器很有意思,领导告诉我是洋葱模型,自己很感兴趣,一通搜索,然后得知redux中间件和koa都用到了 洋葱模型

  2. 研究项目中的 redux-middleware 看不懂 Array.reduce 这个API,然后研究一番,学会并且爱上,然后就不知道忙啥去了;

  3. 过了一段时间 看了redux 源码 学到了 compose—— 这个基于reduce实现,用于组合的函数。更深一步了解了洋葱模型;

  4. 之后摸鱼的时候,去学习 JavaScript 执行机制,了解到执行js脚本时的 函数调用栈,并且了解到了 queue栈这个数据结构,后进先出、压栈、出栈、栈顶 深入脑海;

  5. 后来某个无意间的冥想,驱使我从函数调用栈的角度去理解洋葱模型,然后理解如下:洋葱模型就是利用函数调用栈的特点,从而达到预期的代码的执行顺序;

  6. 然而并没有完,又在一次摸鱼的时候 看到有人说 generator 函数、Promiseco 实现的 async/await, 前面两个知道,第三个是 co 是什么不知道,也没查,领导在旁边直接问,答:co大概就是能把 yield后面跟的 promise resolve之后的值,传给迭代器的下一次next,从而让在 yield前定义的变量接收promise resolve之后的值,示意代码在最下方;

  7. 紧接着就了解到了线程之下的协程,大概就是通过控制线程的占用权,达到预期代码的执行顺序,由于之前就知道redux-saga 就是利用generator函数封装的,通过上面已经大致学会了相关知识,然后把之前没看懂的 redux-saga 大致原理 给看了;

  8. 回头看看差点哭,菜鸡的路就是这么的崎岖,还挺有意思;

function *generatorFn() {
  const aaa = yield somePromise()
};
const it = generatorFn();
const {value: prom} = it.next();
prom.then(value => {
  it.next(value)
  // 此时 函数中 aaa 的值就是 promise resolve的值
})