Code Monkey home page Code Monkey logo

Comments (5)

johnyanarella avatar johnyanarella commented on August 20, 2024

I'm considering adding the following "info" level logging to Deferred and Promise operations:

  • for when then() is called:
    • immediately at the start of that call:
      Registering callbacks with Deferred.
    • just before then() returns the new Promise:
      Returning a Promise of the transformed result.
  • for the Promise returned by a call to then()
    • when that Promise returns a Promise:
      Promise will be completed based on the Promise returned by its callback.
    • when that Promise returns a value:
      Promise resolved with the value returned by its callback: <value>
    • when that Promise throws an Error:
      Promise rejected with the Error returned by its callback: <error.stack>
  • for any Deferred
    • when update() is called:
      Deferred updated with progress: <progress>
    • when resolve() is called:
      Deferred resolved with value: <value>
    • when reject() is called:
      Deferred resolved with error: <error>
    • when cancel() is called:
      Deferred cancelled with reason: <reason>

Does this seem like an appropriate level of logging coverage?

Additionally, in order to aid developers in debugging logic that relies on Promises and Deferreds, I'm considering adding an optional id property to Deferreds. When specified, the logging messages above would be modified to include that identifier.

Thoughts?

from deftjs.

rixo avatar rixo commented on August 20, 2024

The coverage seems fine to me. The identifier should definitely be useful. Maybe it would help to use a different terminology for the Promise created and controlled directly by the user code, and the Promises created by calls to then(). Maybe "Delegate Promise" ?

The "Promise rejected with the Error raised by its callback" message would address issue #59. IMO however, when an error is raised in a callback and there is no registered failure callback to notify, that should be considered an uncatched exception, and so it would be appropriate to log it with an "error" level. That's something you want to see in red in the console, especially if it happens in a production environment where ext-dev has not been included.

Was it really a good idea for the spec that the only way to pass an error to the following promises is by throwing it? Returning (instead of throwing) an instance of an Error object would spare that dangerous catch-all block. Mixing managed errors and unexpected exceptions seems a bit messy to me. I am curious to know what you think about that?

from deftjs.

johnyanarella avatar johnyanarella commented on August 20, 2024

In practice, this approach has proven much too verbose to be useful.

  • Internal Promises used within the Promise helper methods emit detailed logging that is irrelevant to user code.
  • Often the Promise you care about is one that was created as a result of then() chaining, and that Promise can't easily be tagged with an identifier.
  • Valuable logging gets lost in the noise.
  • In a production environment where ext-dev has not been included, real errors are swallowed and go unreported.

Deft JS 0.9 will implement a new helper method available on all Promises called log(). It can be used anywhere in a Promise chain and will log the resolution or rejection of the preceding Promise, passing the result through to allow for further chaining and transformation. log() will support an optional name parameter that is incorporated into the resulting logging message.

Example:

getUser(currentUserId)
  .log("Promise of the current User")
  .then( function (user) {
    return Promise.map(user.friendIds, getUser)
  })
  .log("Promise of a User's friends");
  .done();

In this contrived example, we get the details for a user and use Promise.map() to get the details for all of the user's friends.

The log output for fulfilled Promises would look like this:

[I] Promise of the current User resolved with value: <value>
[I] Promise of a User's friends resolved with value: <value>

The log output for rejected Promises would look like this:

[I] Promise of the current User rejected with error: <error>
[I] Promise of a User's friends rejected with error: <error>

Also note the use of done(), which will also be part of Deft JS 0.9. By placing the done() at the end of this chain, any unhanded rejections earlier in the Promise chain will throw an Error. See #83 for more details.

from deftjs.

johnyanarella avatar johnyanarella commented on August 20, 2024

This feature and its associated unit tests have been implemented in the promises_aplus branch and will be part of the Deft JS 0.9 release.

from deftjs.

johnyanarella avatar johnyanarella commented on August 20, 2024

Deft.Promise::log() is now available as part of the new Promises/A+ compliant rewrite of Deft JS's Promises.

See also: #82

from deftjs.

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.