PromiseMap.js.flow 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /**
  2. * Copyright (c) 2013-present, Facebook, Inc.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. *
  7. * @providesModule PromiseMap
  8. * @flow
  9. */
  10. 'use strict';
  11. const Deferred = require("./Deferred");
  12. const invariant = require("./invariant");
  13. /**
  14. * A map of asynchronous values that can be get or set in any order. Unlike a
  15. * normal map, setting the value for a particular key more than once throws.
  16. * Also unlike a normal map, a key can either be resolved or rejected.
  17. */
  18. class PromiseMap<Tvalue, Treason> {
  19. _deferred: {
  20. [key: string]: Deferred<any, any>
  21. };
  22. constructor() {
  23. this._deferred = {};
  24. }
  25. get(key: string): Promise<any> {
  26. return getDeferred(this._deferred, key).getPromise();
  27. }
  28. resolveKey(key: string, value: Tvalue): void {
  29. const entry = getDeferred(this._deferred, key);
  30. invariant(!entry.isSettled(), 'PromiseMap: Already settled `%s`.', key);
  31. entry.resolve(value);
  32. }
  33. rejectKey(key: string, reason: Treason): void {
  34. const entry = getDeferred(this._deferred, key);
  35. invariant(!entry.isSettled(), 'PromiseMap: Already settled `%s`.', key);
  36. entry.reject(reason);
  37. }
  38. }
  39. function getDeferred(entries: {
  40. [key: string]: Deferred<any, any>
  41. }, key: string): Deferred<any, any> {
  42. if (!entries.hasOwnProperty(key)) {
  43. entries[key] = new Deferred();
  44. }
  45. return entries[key];
  46. }
  47. module.exports = PromiseMap;