Executando verificação de segurança...
3

[DÚVIDA] Como implementar o Promise.any em PHP?

Antes de mais nada é necessário entender que o Promise.any é um método da classe Promise no JavaScript, ele recebe um array de Promises como input e retorna a Primeira Promise a ser executada.

Documentação do método

Dúvida

Investigando o código fonte do CEP Promise encontrei no arquivo src/cep-promise.js o método fetchCepFromServices que faz uma busca do cep em alguns serviços e retorna o primeiro resultado utilizando o Método Promise.any e gostaria de saber como implementar isso em PHP.

Carregando publicação patrocinada...
3

Quem sabe se vc usar swoole, vc terá algo async!

https://openswoole.com/

Open Swoole é uma solução assíncrona completa que possui suporte integrado para programação assíncrona via fibras/corrotinas, uma variedade de módulos de E/S multithread (HTTP Server, WebSockets, GRPC, TaskWorkers, Process Pools) e suporte para clientes PHP populares, como PDO para MySQL, Redis e CURL.

3

PHP não é asíncrono, assim não tem Promise.

Caso esteja trabalhando com filas tem o Job Batch do laravel.

É parecido mas você não pode colocar numa requisição por exemplo.

0

Calma aí meu jovem, não é bem assim, tecnicamente nem Javascript deveria ter Promisses se o critério for ser assincrono (sim, é um fato pouco conhecido, mas JS é uma linguagem sincrona) async e await são apenas açúcar sintático para emular assincronismo, PHP só não tem os açúcares sintáticos mas possui sim suporte a Promisses, toda linguagem turing complete em tese tem suporte a promises

0

sim, é um fato pouco conhecido, mas JS é uma linguagem sincrona

JS é sim assíncrono -> ele permite continuar a execução do código depois de fazer uma operação bloqueante

JS não é paralelo -> ele roda em uma única thread

São coisas diferentes.


Na estrutura vanilla do PHP não há forma de fazer uma requisição web e continuar a execução do código. Somente é possível fazer isso com bibliotecas e extenções.

-3

JS é sim assíncrono -> ele permite continuar a execução do código depois de fazer uma operação bloqueante

Mais ou menos, a linguagem em si não permite, o que javascript faz é um truque que até daria pra fazer em PHP mas fica extremamente lento, mas porque javascript NÃO É assincrono, o objeto Promisse nada mais é que essas bibliotecas PHP pré carregadas no Javascript, o que Javascript faz é um tipo de corroutina onde yeld e resume não devolvem nem injetam valores, quando você faz:

async function fn() {
  console.log(1);
  console.log(2);
  console.log(3);
  console.log(4);
}

É como se estivesse (não é mas na prática...) fazendo:

function *fn() {
  console.log(1);
  yeld;
  console.log(2);
  yeld;
  console.log(3);
  yeld;
  console.log(4);
  yeld;
}

E o looping principal vai checkando se consegue resumir, ou seja, é um código efetivamente sincrono com uma pequena trapaça

Agora observe como funciona quando a linguagem não consegue injetar os pontos de parada:

async function x() {
  const _ = await new Promise(resolve => setTimeout(() => {
    alert("Olá!");
    resolve();
  }, 0));
}

console.log("inicio");
// alert trava a pilha de execução, logo se anular 
// os pontos de parada em setTimeout, o código trava
// a pilha de execução, caso js fosse verdadeiramente
// assincrono, não existiriam funções de bloqueio
await x(); 
console.log("fim");

As requisições em Javascript parecem funcionar de forma assincrona porque fazem a colheita enquanto o resto do código, incusive se você adicionar uma função bloqueadora pode resultar em erros de timeout nas requisições assincronas, em resumo javascript se comporta visualmente de maneira assincrona porque APIs externas igual as bibliotecas externas PHP fazem essa pausa e peritem ser resumidas, async e await são açucar sintatico apenas

1

Para o seu caso específico acredito que a biblioteca guzzle seja utíl, tendo em vista que irá consumir um serviço externo via HTTP.

Outra forma simples de conseguir o que deseja é usando as funções exec ou shell_exec chamando um script js [sic]