第一部分: 半协程调度器

谈及koa(1.x)首先得说co,co与Promise是JSer在解决回调地狱(callback hell)问题前仆后继的众多产物之一。

co其实是Generator的自动执行器(半协程调度器): 通过yield显式操纵控制流让我们可以做到以近乎同步的方式书写非阻塞代码。

Promise是一套比较完善的方案,但关于如何实现Promise本身超出本文范畴, 且PHP没有大量异步接口的历史包袱需要thunks方案做转换。

综上所述, 我们的调度器仅基于一个简单的接口,来抽象异步任务:

  1. <?php
  2. interface Async
  3. {
  4. /**
  5. * 开启异步任务,完成是执行回调,任务结果或异常通过回调参数传递
  6. * @param callable $callback
  7. * continuation :: (mixed $result = null, \Exception|null $ex = null)
  8. * @return void
  9. */
  10. public function begin(callable $callback);
  11. }
  1. 对co库不了解的同学可以先参考阮一峰 - co 函数库的含义和用法
  2. co新版与旧版的区别在于对thunks的支持, 4.x只支持Promises.

我们首先构建Koa的基础设施,渐进的实现一个约50+行代码的精练的半协程调度器。