美文网首页
GuzzleHttp\Promise笔记

GuzzleHttp\Promise笔记

作者: traveller227 | 来源:发表于2018-03-24 23:14 被阅读1355次

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

  1. 异步链式调用
    $promise->then(function($param){echo $param; return $param."1";})
    ->then(function($param){echo $param."2";})
    ->then(function($param){echo $param."3";});

  2. 同步调用
    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

  1. 调用时机
    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/

相关文章

  • GuzzleHttp\Promise笔记

    GuzzleHttp\Promise是对Promises/A+的一个实现。实现功能有:1.异步链式执行。2.can...

  • Promise,async,await笔记

    Promise,async,await笔记 Promise 创建promise对象 Promise对象构造方法传入...

  • Laravel5.4-5.7 smtp邮件发送指南(以163免费

    1.引入 guzzlehttp/guzzle包 命令:composer require guzzlehttp/gu...

  • promise用法

    Promise笔记 1.promise构造函数 Promise是一个构造函数,传参是一个function(reso...

  • promise

    本文是整理阮一峰大神ES6中 Promise 的学习笔记 目录: Promise.prototype.then()...

  • guzzlehttp/guzzle

    (自学自用,不喜勿喷,谢谢) (问题:没办法真正的异步进行求情) Guzzle(curl) composer re...

  • Promise 笔记

    笔记 1. 构造方法 创建promise对象的流程如下����: new Promise(fn) 返回一个prom...

  • Guzzle使用指南

    安装 composer require guzzlehttp/guzzle GET请求 $client = new...

  • Nodejs Promise 读书笔记

    Nodejs Promise 读书笔记 前言 Promise是抽象异步处理对象以及对其进行各种操作的组件。(Pro...

  • 不深入只浅出ES6 Promise | 笔记

    用例子直观的陈列 Promise 的行为作为笔记(如果能帮助新手快速了解 Promise 的使用自然最好,最终还是...

网友评论

      本文标题:GuzzleHttp\Promise笔记

      本文链接:https://www.haomeiwen.com/subject/bvbccftx.html