Coder Social home page Coder Social logo

Comments (2)

felangel avatar felangel commented on June 12, 2024

Hey @narcodico 👋
Thanks for opening an issue!

It seems a bit risky to do this because if I'm understanding correctly, this change could result in runtime type exceptions since bloc would be casting the object to type E for you.

What would be the benefit of that as opposed to:

await emit.onEach(
  _repository.watchData(),
  onData: (data) => add(DataChanged(data)),
  onError: (failure, stackTrace) => add(DataFailed(failure as MyFailure, stackTrace)),
);

The other issue is onError might be called with errors that are outside of the scope of _repository.watchData() for example, if the underlying stream isn't a broadcast stream and there are multiple subscriptions, onError would be called with a StateError.

As a result, I don't think it's safe to do this because the underlying subscription mechanism operates on Object so I don't think we can always safely make the type more specific without risking runtime TypeErrors.

Let me know what you think and thanks again for taking the time to file this issue! 🙏

from bloc.

narcodico avatar narcodico commented on June 12, 2024

Hey @felangel 👋

What would be the benefit of that as opposed to:

await emit.onEach(
  _repository.watchData(),
  onData: (data) => add(DataChanged(data)),
  onError: (failure, stackTrace) => add(DataFailed(failure as MyFailure, stackTrace)),
);

The benefit would be that it would save the developer from manually having to do the cast. It's if the current onEach would not accept a generic data type, but rather would give you a dynamic back and then you'd have to do:
onData: (data) => add(DataChanged(data as MyData)). It's not as clean as having a generic type.

The other issue is onError might be called with errors that are outside of the scope of _repository.watchData() for example, if the underlying stream isn't a broadcast stream and there are multiple subscriptions, onError would be called with a StateError.

I completely agree with this, but at the same time, a developer opting out of the default Object for a custom type would do that because the errors on the stream were handled and converted into a custom failure, e.g.:

Stream<MyData> watchData() => _dataSource.stream.handleError(
        (Object error, StackTrace stackTrace) =>
            throw MyFailure.from(error, stackTrace),
      );

but is also aware of how the stream is being used.
I also feel that the StateError you mentioned about non-broadcast streams being listen to multiple times should not be gracefully handled, since it's an error, not an exception, and should be fixed before releasing.
I can't think of a different error besides this, that could potentially happen after listening to a stream were you handle errors like the one above. Can you?

As a result, I don't think it's safe to do this because the underlying subscription mechanism operates on Object so I don't think we can always safely make the type more specific without risking runtime TypeErrors.

This feature would be great for developers that want to take full control over error handling. I think the usage it's pretty much in the hands of the developer. And the great thing is that not specifying a custom error type would continue operating on Object.

from bloc.

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.