美文网首页
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笔记

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