reactphp 的 promise 是严格遵循 promises/a+ 的 php 异步抽象,必须配合 eventloop 运行;链式调用需显式 return 新 promise;并发用 all/race/any;错误自动冒泡,应集中 catch 处理。

ReactPHP 的 Promise 不是 JavaScript 那套语法,它是 PHP 环境里严格遵循 Promises/A+ 规范的异步抽象,核心目标是把嵌套回调变成可读、可链、可组合的线性流程。用对的关键不在于“写得像 JS”,而在于理解它在 PHP 事件循环(EventLoop)中的角色和约束。
必须配合 EventLoop 运行,不能脱离上下文
ReactPHP 的 Promise 本身不驱动异步——它只是状态容器;真正执行异步逻辑的是 React\EventLoop\Loop。如果你直接 new Promise 并 resolve/reject,但没调用 $loop->run(),代码就停在那里,什么也不会发生。
- 所有异步操作(比如 HTTP 请求、文件读写、定时器)必须注册到 Loop 中,例如用
$loop->futureTick()或$loop->addTimer() - Promise 的 resolve/reject 回调,也由 Loop 在合适时机触发,不是立即执行
- 常见错误:在 CLI 脚本里创建 Promise 后忘了
$loop->run(),程序直接退出
链式调用要返回新 Promise,别漏 return
then()、catch()、finally() 每次都返回一个新 Promise,这是链式能成立的前提。如果在 then() 回调里忘了 return,后续的 then() 就会收到 undefined(PHP 中是 null),导致流程中断或静默失败。
- 正确写法:
->then(function ($data) { return processData($data); }) - 错误写法:
->then(function ($data) { processData($data); })(没返回值,下游收不到结果) - 如果回调里要抛异常,用
throw new \Exception(),它会被自动转为 reject,不用手动调$reject()
并发控制别硬写循环,优先用 all()/race()/any()
处理多个异步任务时,不要用 for 循环 + await(PHP 不支持)或手动嵌套 then,ReactPHP 提供了语义清晰的组合器:
-
all($promises):等全部成功才 resolve,任一失败立刻 reject —— 适合批量拉取数据且缺一不可 -
race($promises):谁先完成(无论成败)就用谁的结果 —— 常用于设置超时,比如race([$apiCall, $timeout]) -
any($promises):只要有一个成功就 resolve,全失败才 reject —— 适合有备用服务的场景 - 注意:
all()返回的是值数组,顺序与输入 Promise 数组一致,不是按完成时间排
错误处理要集中 catch,别每个 then 都写 try/catch
Promise 链的错误会自动冒泡,直到遇到第一个 catch()。你在任意一层 then() 里 throw,都会被链末尾的 catch() 捕获,不需要每层都包 try/catch。
- 推荐结构:
doA()->then(doB)->then(doC)->catch(handleError) -
catch()接收的是\Throwable,可区分具体异常类型做不同处理 - 如果想让错误不中断链,可在
catch()里返回默认值或新 Promise,这样后续then()还能继续执行
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











