반응 후크와 함께 Mutex를 어떻게 사용할 수 있습니까?

Xodarap

코드 블록이 동시에 실행되지 않도록하고 싶습니다. async-Mutex 라이브러리가 나를 위해 작동하지 않는 것 같습니다. 다음은 최소한의 복제입니다.

/* eslint-disable */
import React, { useState, useEffect } from "react";
var Mutex = require("async-mutex").Mutex;

const Timer = () => {
  const [isActive, setIsActive] = useState(false);
  const mutex = new Mutex();

  useEffect(() => {
    mutex.runExclusive(async function () {
      console.log("starting", isActive);
      await new Promise((resolve) => setTimeout(resolve, 1000));
      console.log("ending", isActive);
    });
  }, [isActive]);

  return (
    <div className="app">
      <button onClick={() => setIsActive((prev) => !prev)} type="button">
        {isActive ? "Active" : "Inactive"}
      </button>
    </div>
  );
};

export { Timer as default };

코드 샌드 박스

버튼을 빠르게 두 번 클릭하면 인쇄되는 것을 볼 수 있습니다.

starting 
true
starting 
false
starting 
true
ending 
true
ending 
false

이것들이 인터리브 된 것을 볼 수 있습니다.

이것을 동시에 실행하지 않도록하려면 어떻게해야합니까?

드미트리 모즈 고 보이

데모

import React, { useState, useEffect, useRef, useMemo} from "react";
var Mutex = require("async-mutex").Mutex;

const Timer = () => {
  const [isActive, setIsActive] = useState(false);
  const mutex = useRef(new Mutex());
  // Or another way, it might be a bit more performant,
  // although the Mutex class has an almost empty constructor
  // const mutex= useMemo(()=> new Mutex(), []);

  useEffect(() => {
    mutex.current.runExclusive(async function () {
      console.log("starting", isActive);
      await new Promise((resolve) => setTimeout(resolve, 1000));
      console.log("ending", isActive);
    });
  }, [isActive]);

  return (
    <div className="app">
      <button onClick={() => setIsActive((prev) => !prev)} type="button">
        {isActive ? "Active" : "Inactive"}
      </button>
    </div>
  );
};

export { Timer as default };

이전 함수 호출을 취소하고 마운트 해제시 비동기 루틴 정리를 지원하려는 경우 ( Demo ) :

/* eslint-disable */
import React, { useState, useEffect } from "react";
import CPromise from "c-promise2";
import { useAsyncEffect, useAsyncCallback } from "use-async-effect2";

export default function Timer() {
  const [isActive, setIsActive] = useState(false);

  const callback = useAsyncCallback(
    function* () {
      console.log("starting", isActive);
      yield CPromise.delay(1000);
      console.log("ending", isActive);
    },
    { combine: true }
  );

  useAsyncEffect(
    function* () {
      console.log("mount");
      yield callback();
    },
    [isActive]
  );

  return (
    <div className="app">
      <button onClick={() => setIsActive((prev) => !prev)} type="button">
        {isActive ? "Active" : "Inactive"}
      </button>
    </div>
  );
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

아도니스와 함께 nginx를 어떻게 사용할 수 있습니까?

분류에서Dev

redux-toolkit과 함께 notistick / (모든 스낵바)를 어떻게 사용하고 반응 할 수 있습니까?

분류에서Dev

useFormik 후크와 함께 FieldArray를 사용할 수 있습니까?

분류에서Dev

CatchUnwind Future와 함께 AssertUnwindSafe를 어떻게 사용할 수 있습니까?

분류에서Dev

jquery (if-else)와 함께 localstorage를 어떻게 사용할 수 있습니까?

분류에서Dev

angularJS와 함께 ajax를 어떻게 사용할 수 있습니까?

분류에서Dev

OSGI와 함께 Spring Batch를 어떻게 사용할 수 있습니까?

분류에서Dev

Swift에서 Cocoapods와 함께 Chartboost를 어떻게 사용할 수 있습니까?

분류에서Dev

"git show"와 함께 "source-highlight"를 어떻게 사용할 수 있습니까?

분류에서Dev

: not 의사 클래스와 함께 : before 의사 클래스를 어떻게 함께 사용할 수 있습니까?

분류에서Dev

Scons와 함께 크로스 컴파일러를 어떻게 사용할 수 있습니까?

분류에서Dev

로봇 프레임 워크와 함께 페이 커를 어떻게 사용할 수 있습니까?

분류에서Dev

이메일 확인 링크를 위해 Meteor와 함께 launchmyapp을 어떻게 사용할 수 있습니까?

분류에서Dev

react-datepicker를 반응 후크 양식과 함께 사용할 수 있습니까?

분류에서Dev

c에서 인수와 함께 함수 포인터를 어떻게 사용할 수 있습니까?

분류에서Dev

PL / pgSQL 함수에서 IF와 함께 WITH를 어떻게 사용할 수 있습니까?

분류에서Dev

add / removeClass 및 <audio>에 대한 IF 인수와 함께 parentNode를 어떻게 사용할 수 있습니까?

분류에서Dev

지도 컬렉션의 g : each 변수와 함께 g : render를 어떻게 사용할 수 있습니까?

분류에서Dev

변수 및 다른 숫자와 함께 "for"를 어떻게 사용할 수 있습니까?

분류에서Dev

is () 메서드와 함께 여러 변수 (선택기)를 어떻게 사용할 수 있습니까?

분류에서Dev

좀 더 일반적인 삭제 자와 함께 unique_ptr을 어떻게 사용할 수 있습니까?

분류에서Dev

ffmpeg와 함께 filter와 filter_complex를 어떻게 사용할 수 있습니까?

분류에서Dev

일반 레코드 및 테이블 유형과 함께 'InsertQuery'를 어떻게 사용할 수 있습니까?

분류에서Dev

codeigniter와 함께 mongoDB를 사용하여 특정 필드를 어떻게 선택할 수 있습니까?

분류에서Dev

이를 얻기 위해 MongoDB 및 JS와 함께 map-reduce를 어떻게 사용할 수 있습니까?

분류에서Dev

이 함수와 함께 사용할 객체를 어떻게 선언합니까?

분류에서Dev

비동기 함수와 함께 반응 후크 "useMemo"를 사용하는 방법은 무엇입니까?

분류에서Dev

vb.net의 배열 클래스와 함께 'withevents'를 어떻게 사용할 수 있습니까?

분류에서Dev

mutiObserver / arrive.js와 함께 async / await를 어떻게 사용할 수 있습니까?

Related 관련 기사

  1. 1

    아도니스와 함께 nginx를 어떻게 사용할 수 있습니까?

  2. 2

    redux-toolkit과 함께 notistick / (모든 스낵바)를 어떻게 사용하고 반응 할 수 있습니까?

  3. 3

    useFormik 후크와 함께 FieldArray를 사용할 수 있습니까?

  4. 4

    CatchUnwind Future와 함께 AssertUnwindSafe를 어떻게 사용할 수 있습니까?

  5. 5

    jquery (if-else)와 함께 localstorage를 어떻게 사용할 수 있습니까?

  6. 6

    angularJS와 함께 ajax를 어떻게 사용할 수 있습니까?

  7. 7

    OSGI와 함께 Spring Batch를 어떻게 사용할 수 있습니까?

  8. 8

    Swift에서 Cocoapods와 함께 Chartboost를 어떻게 사용할 수 있습니까?

  9. 9

    "git show"와 함께 "source-highlight"를 어떻게 사용할 수 있습니까?

  10. 10

    : not 의사 클래스와 함께 : before 의사 클래스를 어떻게 함께 사용할 수 있습니까?

  11. 11

    Scons와 함께 크로스 컴파일러를 어떻게 사용할 수 있습니까?

  12. 12

    로봇 프레임 워크와 함께 페이 커를 어떻게 사용할 수 있습니까?

  13. 13

    이메일 확인 링크를 위해 Meteor와 함께 launchmyapp을 어떻게 사용할 수 있습니까?

  14. 14

    react-datepicker를 반응 후크 양식과 함께 사용할 수 있습니까?

  15. 15

    c에서 인수와 함께 함수 포인터를 어떻게 사용할 수 있습니까?

  16. 16

    PL / pgSQL 함수에서 IF와 함께 WITH를 어떻게 사용할 수 있습니까?

  17. 17

    add / removeClass 및 <audio>에 대한 IF 인수와 함께 parentNode를 어떻게 사용할 수 있습니까?

  18. 18

    지도 컬렉션의 g : each 변수와 함께 g : render를 어떻게 사용할 수 있습니까?

  19. 19

    변수 및 다른 숫자와 함께 "for"를 어떻게 사용할 수 있습니까?

  20. 20

    is () 메서드와 함께 여러 변수 (선택기)를 어떻게 사용할 수 있습니까?

  21. 21

    좀 더 일반적인 삭제 자와 함께 unique_ptr을 어떻게 사용할 수 있습니까?

  22. 22

    ffmpeg와 함께 filter와 filter_complex를 어떻게 사용할 수 있습니까?

  23. 23

    일반 레코드 및 테이블 유형과 함께 'InsertQuery'를 어떻게 사용할 수 있습니까?

  24. 24

    codeigniter와 함께 mongoDB를 사용하여 특정 필드를 어떻게 선택할 수 있습니까?

  25. 25

    이를 얻기 위해 MongoDB 및 JS와 함께 map-reduce를 어떻게 사용할 수 있습니까?

  26. 26

    이 함수와 함께 사용할 객체를 어떻게 선언합니까?

  27. 27

    비동기 함수와 함께 반응 후크 "useMemo"를 사용하는 방법은 무엇입니까?

  28. 28

    vb.net의 배열 클래스와 함께 'withevents'를 어떻게 사용할 수 있습니까?

  29. 29

    mutiObserver / arrive.js와 함께 async / await를 어떻게 사용할 수 있습니까?

뜨겁다태그

보관