Giter VIP home page Giter VIP logo

Comments (9)

jsor avatar jsor commented on June 18, 2024

Promise resolution is synchronous by default, except when you resolve them asynchronously.

$loop->futureTick(function () use ($d) {
    $d->resolve('resolve');
});

from promise.

Logioniz avatar Logioniz commented on June 18, 2024

I think that then method must be asynchronous.

I think it fix all problem here.

I found another implementation of promise in popular framework mojolicious (sorry this is perl but code implementation is very simple). The method then is called there asynchronously. Link to code.

What do you think about it?

from promise.

jsor avatar jsor commented on June 18, 2024

Could you explain why resolution should be asynchronous and what exact problem would be solved?

from promise.

Logioniz avatar Logioniz commented on June 18, 2024

I write tests where i use run and stop method of event loop many times.
Simplified code of my tests looks like it is written in the first post.
Then method should be non-blocking because of expected behavior.

from promise.

WyriHaximus avatar WyriHaximus commented on June 18, 2024

Bear in mind that a promise is nothing more then a communication channel. It only does things when you it to. So while it's own execution is synchronous it enables us to write non-blocking code. The then does nothing more then set the callbacks to run when the promise resolves, and run it when the promise already resolved. Consider the following:

$deferred = new Deferred();

We get a promise from the deferred object and set a resolve handler on it:

$deferred->promise()->then(function () {
    echo 'resolved!', PHP_EOL;
});

Now up to this point nothing is echoed. But once we call $deferred->resolve(); resolved! will be echoed. So when you call it like this resolved! will be echoed the moment you call then:

$deferred = new Deferred();
$deferred->resolve();
$deferred->promise()->then(function () {
    echo 'resolved!', PHP_EOL;
});

And that is exactly what your example does, it resolves the promise the moment you create it. Which is the expected behaviour.

Also the reason why you have an infinite loop with that example is because you have an open connection with Google and it takes a while for the timeout to kick in and the connection to close.

from promise.

Logioniz avatar Logioniz commented on June 18, 2024

Also the reason why you have an infinite loop with that example is because you have an open connection with Google and it takes a while for the timeout to kick in and the connection to close.

I repeat, I am writing tests. The connection is established in the setup method, and the connection is closed in the teardown method. This is logical for me. The effect is the same.

And that is exactly what your example does, it resolves the promise the moment you create it. Which is the expected behaviour.

It looks like for different people the expected behavior is different. For this reason, I am going to close the topic.

I have a question, how to use assert in event loop or what if exception appears in event loop in tests? At this point, there is an infinite loop again.

from promise.

WyriHaximus avatar WyriHaximus commented on June 18, 2024

@Logioniz these tests? https://github.com/Logioniz/reactphp-memcached/blob/master/tests/FunctionalTest.php#L242

from promise.

Logioniz avatar Logioniz commented on June 18, 2024

Yes.

from promise.

WyriHaximus avatar WyriHaximus commented on June 18, 2024

Cheers, slowly working on a PR with some suggestions 😄

from promise.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.