Promise.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Vector.h>
  8. #include <LibJS/Runtime/Object.h>
  9. namespace JS {
  10. ThrowCompletionOr<Object*> promise_resolve(GlobalObject&, Object& constructor, Value);
  11. class Promise final : public Object {
  12. JS_OBJECT(Promise, Object);
  13. public:
  14. enum class State {
  15. Pending,
  16. Fulfilled,
  17. Rejected,
  18. };
  19. enum class RejectionOperation {
  20. Reject,
  21. Handle,
  22. };
  23. static Promise* create(GlobalObject&);
  24. explicit Promise(Object& prototype);
  25. virtual ~Promise() = default;
  26. State state() const { return m_state; }
  27. Value result() const { return m_result; }
  28. struct ResolvingFunctions {
  29. FunctionObject& resolve;
  30. FunctionObject& reject;
  31. };
  32. ResolvingFunctions create_resolving_functions();
  33. Value fulfill(Value value);
  34. Value reject(Value reason);
  35. Value perform_then(Value on_fulfilled, Value on_rejected, Optional<PromiseCapability> result_capability);
  36. private:
  37. virtual void visit_edges(Visitor&) override;
  38. bool is_settled() const { return m_state == State::Fulfilled || m_state == State::Rejected; }
  39. void trigger_reactions() const;
  40. State m_state { State::Pending };
  41. Value m_result;
  42. Vector<PromiseReaction*> m_fulfill_reactions;
  43. Vector<PromiseReaction*> m_reject_reactions;
  44. bool m_is_handled { false };
  45. };
  46. }