GuzzleHttp\Promise笔记
GuzzleHttp\Promise是对Promises/A+的一个实现。
实现功能有:
1.异步链式执行。
2.cancel操作(Promise状态仍然处于pending时)
3.wait同步链式执行(违反了Promise/A+的规定,PA+规定是异步执行; 猜测这个功能是专门为GuzzleHttp提供的)
基本用法:
1.异步调用
echo 'step1';
$promise = new \GuzzleHttp\Promise\Promise();
$promise->resolve('step 3");
$promise->then(function($param){echo $param;});
echo 'step2';
// 执行顺序
step1
step2
step3
-
异步链式调用
$promise->then(function($param){echo $param; return $param."1";})
->then(function($param){echo $param."2";})
->then(function($param){echo $param."3";}); -
同步调用
echo 'step1';
$promise = new \GuzzleHttp\Promise\Promise();
$promise->resolve('step 3");
$promise->then(function($param){echo $param;})->wait();
echo 'step2';
// 执行顺序
step1
step3 (会阻塞执行,直到step3执行结束才会执行后续的step2)
step2
遇到的几个问题记录如下:
1.执行顺序问题:
通常按照then链式顺序调用,非链式关系会有非预期的结果。
例如:
$promise->then($callback1)->then($callback2)->then($callback3);
$promise->then($callback4);
// 实际执行顺序是: $callback1=>$callback4=>$callback2=>$callback3
- 调用时机
promise基本原理是一系列回调函数入队列,而出队列的函数注册到php脚本结束是运行的register_shutdown_function函数中。
因此,所有的promise都是入队列,脚本执行结束再执行;如果脚本执行结束之前,有E_ERROR级别错误,promise不会执行。
例如:
<?php
...
// promise由于后面脚本的Fatal_error不会执行了
$promise->then($callback1)->then($callback2)->then($callback3);
// Fatal error: Uncaught Error: Call to a member function undefinedMethod()
$undefinedClass->undefinedMethod($param);
使用场景
1.模拟异步操作(Guzzle就是很好的例子)
2.和执行上下文无关(例如发邮件、记日志等)
Refer:
另一个promise实现(基于php的declare实现)
http://sabre.io/event/install/