Dashboard sipadu mbip
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

useStateAsync.js 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = void 0;
  4. var _react = require("react");
  5. /**
  6. * A hook that mirrors `useState` in function and API, expect that setState
  7. * calls return a promise that resolves after the state has been set (in an effect).
  8. *
  9. * This is _similar_ to the second callback in classy setState calls, but fires later.
  10. *
  11. * ```ts
  12. * const [counter, setState] = useStateAsync(1);
  13. *
  14. * const handleIncrement = async () => {
  15. * await setState(2);
  16. * doWorkRequiringCurrentState()
  17. * }
  18. * ```
  19. *
  20. * @param initialState initialize with some state value same as `useState`
  21. */
  22. function useStateAsync(initialState) {
  23. var _useState = (0, _react.useState)(initialState),
  24. state = _useState[0],
  25. setState = _useState[1];
  26. var resolvers = (0, _react.useRef)([]);
  27. (0, _react.useEffect)(function () {
  28. resolvers.current.forEach(function (resolve) {
  29. return resolve(state);
  30. });
  31. resolvers.current.length = 0;
  32. }, [state]);
  33. var setStateAsync = (0, _react.useCallback)(function (update) {
  34. return new Promise(function (resolve, reject) {
  35. setState(function (prevState) {
  36. try {
  37. var nextState; // ugly instanceof for typescript
  38. if (update instanceof Function) {
  39. nextState = update(prevState);
  40. } else {
  41. nextState = update;
  42. } // If state does not change, we must resolve the promise because
  43. // react won't re-render and effect will not resolve. If there are already
  44. // resolvers queued, then it should be safe to assume an update will happen
  45. if (!resolvers.current.length && Object.is(nextState, prevState)) {
  46. resolve(nextState);
  47. } else {
  48. resolvers.current.push(resolve);
  49. }
  50. return nextState;
  51. } catch (e) {
  52. reject(e);
  53. throw e;
  54. }
  55. });
  56. });
  57. }, [setState]);
  58. return [state, setStateAsync];
  59. }
  60. var _default = useStateAsync;
  61. exports.default = _default;