{"id":13616601,"url":"https://github.com/streamcommon/promise","last_synced_at":"2025-04-23T01:34:51.893Z","repository":{"id":57060382,"uuid":"173616088","full_name":"streamcommon/promise","owner":"streamcommon","description":"PHP Promises/A+ implementation","archived":false,"fork":false,"pushed_at":"2020-06-28T15:21:47.000Z","size":207,"stargazers_count":15,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-29T20:51:11.160Z","etag":null,"topics":["php-async","php-extension","php7","promise","promises-aplus","promisesaplus","swoole"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/streamcommon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-03T18:50:54.000Z","updated_at":"2023-11-17T16:24:49.000Z","dependencies_parsed_at":"2022-08-24T14:53:31.697Z","dependency_job_id":null,"html_url":"https://github.com/streamcommon/promise","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/streamcommon%2Fpromise","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/streamcommon%2Fpromise/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/streamcommon%2Fpromise/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/streamcommon%2Fpromise/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/streamcommon","download_url":"https://codeload.github.com/streamcommon/promise/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250353632,"owners_count":21416691,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["php-async","php-extension","php7","promise","promises-aplus","promisesaplus","swoole"],"created_at":"2024-08-01T20:01:30.743Z","updated_at":"2025-04-23T01:34:51.846Z","avatar_url":"https://github.com/streamcommon.png","language":"PHP","funding_links":[],"categories":["PHP"],"sub_categories":[],"readme":"# PHP Promises/A+ implementation\n[![PHP \u003e= 7.2 ][PHP image]](http://php.net)\n[![Swoole \u003e= 4.2][Swoole image]](https://github.com/swoole/swoole-src)\n[![Latest Stable Version](https://poser.pugx.org/streamcommon/promise/v/stable)](https://packagist.org/packages/streamcommon/promise)\n[![Total Downloads](https://poser.pugx.org/streamcommon/promise/downloads)](https://packagist.org/packages/streamcommon/promise)\n[![License](https://poser.pugx.org/streamcommon/promise/license)](./LICENSE)\n\nThis package provides [Promise/A+](https://github.com/promises-aplus/promises-spec) PHP implementation.\n\n# Branches\n[![Master][Master branch image]][Master branch] [![Build Status][Master image]][Master] [![Coverage Status][Master coverage image]][Master coverage]\n\n[![Develop][Develop branch image]][Develop branch] [![Build Status][Develop image]][Develop] [![Coverage Status][Develop coverage image]][Develop coverage]\n\n## Installation\nConsole run:\n```console\n    composer require streamcommon/promise\n```\nOr add into your `composer.json`:\n```json\n    \"require\": {\n        \"streamcommon/promise\": \"*\"\n    }\n```\n\u003e If you want see TRUE promise then install [Swoole](http://php.net/manual/en/swoole.installation.php) extension. \n\u003e For more info visit the [Swoole repo](https://github.com/swoole/swoole-src)\n\u003e\u003e NOTE: TRUE promise work only in CLI mode\n\n## Promise\nPromise is a library which provides [Promise/A+](https://github.com/promises-aplus/promises-spec) PHP implementation.\n\nAll Promise it a special PHP classes that contains its state:\n- `pending` - PromiseInterface::STATE_PENDING\n- `fulfilled` - PromiseInterface::STATE_FULFILLED\n- `rejected` - PromiseInterface::STATE_REJECTED\n\nTo initiate a new promise, you can use static method `PromiseInterface::create` or create with new.\nAll resulting `Promise` has `PromiseInterface::STATE_PENDING` state.\n```php\n    $promise = new Promise(function(callable $resolve, callable $reject));\n    // OR\n    $promise = Promise::create(function(callable $resolve, callable $reject))\n```\n\nWhen `function($resolve, $reject)` executor finishes the job, it should call one of the functions:\n- `$resolve` to indicate that the job finished successfully and set `Promise` state to `PromiseInterface::STATE_FULFILLED`\n```php\n    $resolve = function ($value) {\n        $this-\u003esetState(PromiseInterface::STATE_FULFILLED);\n        $this-\u003esetResult($value);\n    };\n```\n- `$reject` to indicate that an error occurred and set `Promise` state to `PromiseInterface::STATE_REJECTED`\n```php\n    $reject = function ($value) {\n        $this-\u003esetState(PromiseInterface::STATE_REJECTED);\n        $this-\u003esetResult($value);\n    };\n```\n\nMethod `PromiseInterface::then()` it be called after promise change stage. In terms of our analogy: this is the “subscription\".\n```php\n    public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface;\n```\n- `$onFulfilled` run when the `Promise` is resolved and it has `PromiseInterface::STATE_FULFILLED` state.\n- `$onFulfilled` run when the `Promise` is rejected and it has `PromiseInterface::STATE_REJECTED` state.\n\u003e NOTE: If `$onFulfilled` or `$onFulfilled` is not a callable function it was ignore\n\nCalling `PromiseInterface::resolve()` creates a successfully executed promise with the result value.\n```php\n    public static function resolve($value): PromiseInterface;\n```\nIt is similar to:\n```php\n    $promise = new Promise(function(callable $resolve) {\n        $resolve($value)\n    });\n```\nSimilarly `PromiseInterface::reject()` creates an already executed promise with an error value.\n```php\n    public static function reject($value): PromiseInterface;\n```\nIt is similar to:\n```php\n    $promise = new Promise(function(callable $resolve, callable $reject) {\n        $reject($value)\n    });\n```\n## Sub promise\nWhen `function($resolve, $reject)` executor finishes the job, it can return `PromiseInterface`.\n```php\n    $promise = Promise::create(function (callable $resolve) {\n        $resolve(Promise::create(function (callable $subResolve) {\n            $subResolve(42);\n        }));\n    });\n```\nIn this case, it will wait for the execution of sub promise.\n\nMethod `PromiseInterface::then()` can return `PromiseInterface` to.\n```php\n    $promise-\u003ethen(function ($value) {\n        return Promise::create(function (callable $resolve) use ($value) {\n            $resolve($value + 1);\n        });\n    });\n```\nFor more info check [example](/example) scripts.\n\n## Example\n\n\u003e Standard Promise\n```php\n    use Streamcommon\\Promise\\Promise;\n    \n    $promise = Promise::create(function (callable $resolve) {\n        $resolve(41);\n    });\n    $newPromise = $promise-\u003ethen(function ($value) {\n        return $value + 1;\n    });\n    $promise-\u003ethen(function ($value) {\n        echo $value . ' === 41' . PHP_EOL;\n    });\n    $newPromise-\u003ethen(function ($value) {\n        echo $value . ' === 42' . PHP_EOL;\n    });\n    $promise-\u003ewait(); // promise execution\n```\n\n\u003e If you want see TRUE promise then install [Swoole](http://php.net/manual/en/swoole.installation.php) extension. \n\u003e For more info visit the [Swoole repo](https://github.com/swoole/swoole-src)\n\u003e\u003e NOTE: TRUE promise work only in CLI mode\n\n```php\n    use Streamcommon\\Promise\\ExtSwoolePromise;\n    \n    // be careful with this\n    \\Swoole\\Runtime::enableCoroutine(); // IF YOU WANT REALY ASYNC\n    \n    $promise = ExtSwoolePromise::create(function (callable $resolve) {\n        // the function is executed automatically when the promise is constructed\n        $resolve(41);\n    });\n    $promise-\u003ethen(function ($value) {\n        // the function is executed automatically after __constructor job\n        return $value + 1;\n    })-\u003ethen(function ($value) {\n        // the function is executed automatically after ::then()\n        echo $value . PHP_EOL;\n    });\n```\n\u003e Sub promise\n```php\n    use Streamcommon\\Promise\\Promise;\n\n    $promise = Promise::create(function (callable $resolve) {\n        $resolve(Promise::create(function (callable $resolve) {\n            $resolve(42);\n        }));\n    });\n    $newPromise = $promise-\u003ethen(function ($value) {\n        return $value + 1;\n    });\n    $superNewPromise = $promise-\u003ethen(function ($value) {\n        return Promise::create(function (callable $resolve) use ($value) {\n            $resolve($value + 2);\n        });\n    });\n    $promise-\u003ethen(function ($value) {\n        echo $value . ' === 42' . PHP_EOL;\n    });\n    $newPromise-\u003ethen(function ($value) {\n        echo $value . ' === 43' . PHP_EOL;\n    });\n    $superNewPromise-\u003ethen(function ($value) {\n        echo $value . ' === 44' . PHP_EOL;\n    });\n    $promise-\u003ewait();\n```\n\u003e Sub async promise\n```php\n    use Streamcommon\\Promise\\ExtSwoolePromise;\n    \n    // be careful with this\n    \\Swoole\\Runtime::enableCoroutine(); // IF YOU WANT REALY ASYNC\n    \n    $promise = ExtSwoolePromise::create(function (callable $resolve) {\n        $promise = ExtSwoolePromise::create(function (callable $resolve) {\n            $resolve(41);\n        });\n        $promise-\u003ethen(function ($value) use ($resolve) {\n            $resolve($value);\n        });\n    });\n    $promise-\u003ethen(function ($value) {\n        return $value + 1;\n    })-\u003ethen(function ($value) {\n        echo $value . PHP_EOL;\n    });\n```\n\u003e If use `ExtSwoolePromise` with `daemon|cycle|loop` you must use `Swoole\\Runtime::wait()`\n```php\n    \\Swoole\\Runtime::enableCoroutine();\n    while (true) {\n        ///\n        Some code with ExtSwoolePromise\n        ///\n        \\Swoole\\Runtime::wait();\n    }\n```\n[PHP image]: https://img.shields.io/badge/php-%3E%3D%207.2-blue.svg\n[Swoole image]: https://img.shields.io/badge/swoole-%3E%3D%204.2-blue.svg\n[Master branch]: https://github.com/streamcommon/promise/tree/master\n[Master branch image]: https://img.shields.io/badge/branch-master-blue.svg\n[Develop branch]: https://github.com/streamcommon/promise/tree/develop\n[Develop branch image]: https://img.shields.io/badge/branch-develop-blue.svg\n[Master image]: https://travis-ci.org/streamcommon/promise.svg?branch=master\n[Master]: https://travis-ci.org/streamcommon/promise\n[Master coverage image]: https://coveralls.io/repos/github/streamcommon/promise/badge.svg?branch=master\n[Master coverage]: https://coveralls.io/github/streamcommon/promise?branch=master\n[Develop image]: https://travis-ci.org/streamcommon/promise.svg?branch=develop\n[Develop]: https://travis-ci.org/streamcommon/promise\n[Develop coverage image]: https://coveralls.io/repos/github/streamcommon/promise/badge.svg?branch=develop\n[Develop coverage]: https://coveralls.io/github/streamcommon/promise?branch=develop","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstreamcommon%2Fpromise","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstreamcommon%2Fpromise","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstreamcommon%2Fpromise/lists"}