Amphp之Promise组合器

9 篇文章 0 订阅
9 篇文章 0 订阅

Amp之Promise组合器

多个 Promise 可以使用不同的函数组合成一个 Promise。

all()

Amp\Promise\all()将一组 Promise 对象组合成一个 Promise,当该组中的所有 Promise 解决时,该 Promise 将解决。如果任何一个 Amp\Promise 实例失败,则组合器的 Promise 将失败。否则,生成的 Promise 将通过一个数组将输入数组中的键与其解析值匹配成功。

all()组合器非常强大,因为它允许我们同时执行许多异步操作。让我们看一个使用 Amp HTTP 客户端 (Artax) 并发检索多个 HTTP 资源的简单示例:

<?php

use Amp\Loop;
use Amp\Promise;

Loop::run(function () {
    $httpClient = new Amp\Artax\DefaultClient;
    $uris = [
        "google" => "http://www.google.com",
        "news"   => "http://news.google.com",
        "bing"   => "http://www.bing.com",
        "yahoo"  => "https://www.yahoo.com",
    ];

    try {
        // magic combinator sauce to flatten the promise
        // array into a single promise.
        // yielding an array is an implicit "yield Amp\Promise\all($array)".
        $responses = yield array_map(function ($uri) use ($httpClient) {
            return $httpClient->request($uri);
        }, $uris);

        foreach ($responses as $key => $response) {
            printf(
                "%s | HTTP/%s %d %s\n",
                $key,
                $response->getProtocolVersion(),
                $response->getStatus(),
                $response->getReason()
            );
        }
    } catch (Amp\MultiReasonException $e) {
        // If any one of the requests fails the combo will fail and
        // be thrown back into our generator.
        echo $e->getMessage(), "\n";
    }

    Loop::stop();
});

some()

Amp\Promise\some()与 all() 相同,只是它可以容忍个别故障。只要传递的promise中至少有一个成功,合并的promise就会成功。成功的解析值是 [$arrayOfErrors, $arrayOfValues] 形式的数组。组件数组中的各个键从传递给仿函数进行评估的承诺数组中保留下来。

any()

Amp\Promise\any()与 some() 相同,只是它容忍所有失败。即使所有的承诺都失败了,它也会成功。

first()

Amp\Promise\first()以第一个成功结果解析。仅当组中的所有 Promise 都失败或 Promise 数组为空时,生成的 Promise 才会失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Promise 中,执行函数是一个函数,它在 Promise 对象被创建时立即执行。执行函数接收两个参数:resolve 和 reject。 resolve 函数用于将 Promise 对象的状态设为“已完成”(fulfilled),并将 Promise 对象的值设为传递给 resolve 函数的值。reject 函数用于将 Promise 对象的状态设为“已拒绝”(rejected),并将 Promise 对象的值设为传递给 reject 函数的值。 执行函数通常包含异步操作,例如网络请求或文件读取。在执行函数中,如果异步操作成功完成,则调用 resolve 函数将 Promise 对象的状态设为“已完成”,并将异步操作的结果传递给 resolve 函数。如果异步操作失败,则调用 reject 函数将 Promise 对象的状态设为“已拒绝”,并将异步操作失败的原因传递给 reject 函数。 以下是一个简单的例子,演示了 Promise 中的执行函数: ``` const promise = new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const result = Math.random(); if (result < 0.5) { // 如果异步操作成功,调用 resolve 函数 resolve(result); } else { // 如果异步操作失败,调用 reject 函数 reject(new Error('Async operation failed')); } }, 1000); }); promise.then( result => console.log(`Promise fulfilled with result: ${result}`), error => console.error(`Promise rejected with error: ${error}`) ); ``` 在上面的代码中,Promise 对象被创建时立即执行执行函数。执行函数是一个匿名函数,它接收两个参数:resolve 和 reject。在异步操作完成后,根据异步操作的结果调用 resolve 或 reject 函数,从而将 Promise 对象的状态设为“已完成”或“已拒绝”。最后,使用 then 方法处理 Promise 对象的状态变化,输出 Promise 对象的值或错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值