비동기식 디더링 모드 도입

지옥이것은 자바스크립트 개발자들이 가장 두려워하는 일이다.특히 jQuery나 노드 표준 라이브러리 등 남겨진 API를 처리할 때다행히도 해결 방안이 이미 도착했다.Angular와 같은 프레임워크가 등장하여 HTML 구현을 간소화했다.Promises는 비동기 함수를 처리하는 표준적이고 간단한 방법을 가져왔다.현재 async/await 비선형 경로를 가진 비동기 코드를 작성하는 것이 쉬워졌습니다.
그러나 현재 이 층은 최종 형태로 안정되어 UI 개발에 사용할 수 있는 더 높은 층 모델을 구축하는 방법을 고민하는 것이 좋은 생각이다.
모든 전형적인 사용자 인터페이스는 기본적으로 두 부분으로 나뉜다.이 정보의 입력을 내비게이션/필터링/변경하는 것 외에도 많은 정보가 있다.이 모든 것은 서버에서 발생하는데, 앞부분은 그 중의 한 보기일 뿐이다.즉, 프런트엔드와 API는 사용자 입력에 반응하기 위해 자주 통신해야 합니다.만약 네가 이미 충분한 시간을 했다면, 너는 알게 될 것이다.
  • 이것은 즉각적인 것이 아닙니다. 사용자가 하고 있는 동작을 경고해야 합니다
  • 사용자는 어리석고 짜증이 나며 불러오는 과정에서 버튼을 수차례 누르지 않는다
  • 때때로 오류가 발생할 수 있습니다. 스냅 오류를 잊어버리면 전체 프로세스가 붕괴되고 UI가 원치 않는 상태가 됩니다
  • 물론 다른 문제도 많지만, 나는 이 문제들에 중점을 두었다. 왜냐하면 그들은 모두 상술한 모든 사람들이 가장 좋아하는 언어 중의 특수성과 관련이 있기 때문이다.비동기 코드를 둘러싸고 머리를 쥐어짜는 것은 정말 어렵다.너의 사용자의 머리를 위에 감는 것은 더욱 어렵다.

    예상 트래픽


    좋아, 그럼 우리는 이렇게 하지 말자.아니면 더 정확히 말하면 일하면 영원히 편안해지고 더 쉬운 심리 패턴을 견지한다.
    UI와 같은 실시간 검색을 하고 있다고 가정해 보세요.네가 입력을 하나 입력하면 결과는 아래에 나타날 것이다.테두리 상자를 거두어라.당신은 그것을 어떻게 생각합니까?
  • 사용자 이벤트 트리거 호출(__call__()
  • 요청이 유효한지 확인하십시오(validate()
  • 그리고 사용자에게 마운트 표시기(prepare()
  • 요청을 실행할 수 있음(run()
  • 결과에 따라 결과(success() 또는 오류(failure()
  • 를 처리할 수 있습니다.
  • 현재 모든 컨텐츠가 로드되었으며 로더 해제 (cleanup()
  • 왜 더 복잡합니까?이 모형을 기억하고 모든 갈고리를 실현하면 시작할 수 있다.약속 덕분에 run() 어떤 임무를 하든지 이렇게 추상적으로 할 수 있다.특히 대부분의 경우 axios 또는 다른 HTTP 라이브러리를 통한 단일 API 호출로 약속이 되돌아왔기 때문이다.
    물론 사용자가 run() 동안 을 클릭하면 어떻게 됩니까?첫 번째 요청을 실행하기 전에 기다리려면 어떻게 해야 합니까?나는 가능한 가장자리 상황을 고려하여 이 그림을 얻었다.

    다 이해해야 돼요?그렇게 지도 모른다, 아마, 아마...모든 화살표, 연결, 연결은 가능한 한 정교하다고 여겨지기 때문에 필요하다면 더욱 추진할 수 있다.만약 이것이 네가 하고 싶은 일이라면, 너는 분명히 그것을 이해해야 한다.만약 없다면, 단지 설명을 따르고, 간소화 모델을 기억하면, 모든 것이 좋아질 것이다!

    코드 예제


    물론 나는 도표에 머무르지 않았다.코드야말로 가장 중요한 것이지, 그렇지?
    소개wasync/debounce!
    이 예에 대해 우리는 debounce demo의 계발을 받은 코드를 배울 것이다.
    우리는 지금 시뮬레이션 검색을 진행하고 있다.아날로그 함수에 들어가는 것을 입력하십시오. 이 함수는 1초 후에 조회를 표시하고 결과를 표시합니다.이 모든 것은 Vue 구성 요소로 이루어집니다.
    간단한 템플릿:
        <div class="debounce">
            <div>
                <input type="text" v-model="search">
            </div>
    
            <ul>
                <li>Search = {{ search }}</li>
                <li>Result = {{ result }}</li>
                <li>Loading = {{ loading }}</li>
            </ul>
        </div>
    
    우리는 몇 가지 변수에 의존한다.
  • search 검색 검색 텍스트
  • result 이 조회
  • 의 결과입니다.
  • loading는 현재 로드 상태를 나타내는 플래그입니다
  • 이제 디더링을 어셈블리에 삽입합니다.
    import {ObjectDebounce} from 'wasync';
    
    export default {
        // ...
    
        watch: {
            search: new ObjectDebounce().func({
                // insert code here
            })
        },
    }
    
    지금부터 우리는 함수의 출력을 떨기 위해 new ObjectDebounce().func() 을 호출할 것이다.
    보시다시피 디더링 함수는 Vue 값을 관찰하는 데 직접 사용할 수 있습니다(이 예에서는 텍스트 검색).Vue 모니터링 시스템으로 인해 search() 값이 변경될 때마다 이 값은 search 함수에 매개 변수로 전달됩니다.
                validate(search) {
                    return {search};
                },
    
    디더링 함수를 호출하는 매개 변수 (이 예에서 검색 값) 를 갈고리 validate() 에 한 글자씩 전달합니다.이 갈고리는 두 가지 작용이 있다.

  • 입력을 확인합니다.입력 값이 좋지 않으면false ish 값을 되돌려야 합니다.

  • 실행 매개 변수를 생성합니다.validate()의 반환값은 매개변수로 전달됩니다 run().객체를 되돌리려면 실행 중에 변이가 발생하지 않는 복사본인지 확인합니다.
  •             prepare() {
                    this.loading = true;
                },
    
    prepare() 갈고리를 사용하여 UI 로드를 준비할 수 있습니다.이 경우 loading 로고를 true 로 설정하면 됩니다.
                cleanup() {
                    this.loading = false;
                },
    
    다른 한편, 함수가 실행을 마쳤을 때, 우리는 로더 프로그램을 사용하지 않기를 희망합니다. loadingfalse 로 설정하기만 하면 됩니다.
                run({search}) {
                    return doTheSearch({search});
                },
    
    그것은 메인 요리다.이곳은 우리가 실제로 일하는 곳이다.여기에서, 그것은 doTheSearch() 함수로 표시되지만, 당신이 하고 싶은 모든 비동기적인 일을 할 수 있다.
  • run() 가 반환 Promise 되면 기다립니다.
  • run()의 첫 번째이자 유일한 매개 변수는 validate()의 반환값이다.
  • 실행할 때 디더링 함수를 호출하면 최근의 호출만 다른 run() 호출을 초래하고 다른 호출은 버려진다.
  • 모든 이상과 승낙 거절을 포착하고 촉발failure() 갈고리
  •             success(result) {
                    this.result = result;
                },
    
    run()로부터 반환/해석 값을 첫 번째이자 유일한 매개 변수로 성공적으로 수신했습니다.그럼 네가 뭘 좀 해줘!
                failure(error) {
                    alert(error.message);
                },
    
    일이 항상 계획대로 진행되는 것은 아니다.run() 이상이 발생하거나 거부되면 이 이상은 failure() 의 첫 번째이자 유일한 매개 변수로 전달됩니다.

    요점을 요약하여 다시 말하다.


    마지막으로, 우리의 구성 요소는 다음과 같다.
    <template>
        <div class="debounce">
            <div>
                <input type="text" v-model="search">
            </div>
    
            <ul>
                <li>Search = {{ search }}</li>
                <li>Result = {{ result }}</li>
                <li>Loading = {{ loading }}</li>
            </ul>
        </div>
    </template>
    
    <script>
    import {ObjectDebounce} from 'wasync';
    
    function doTheSearch({search}) {
        return new Promise((resolve) => {
            setTimeout(() => resolve(`You searched "${search}"`), 1000);
        });
    }
    
    export default {
        data() {
            return {
                search: '',
                result: '',
                loading: false,
            };
        },
    
        watch: {
            search: new ObjectDebounce().func({
                validate(search) {
                    return {search};
                },
                prepare() {
                    this.loading = true;
                },
                cleanup() {
                    this.loading = false;
                },
                run({search}) {
                    return doTheSearch({search});
                },
                success(result) {
                    this.result = result;
                },
                failure(error) {
                    alert(error.message);
                },
            })
        },
    }
    </script>
    
    비록 이것은 보잘것없어 보이지만, 실제로는 전투를 거친 코드이며, 사용자에게 그들의 조작이 무엇이든지 간에 매끄러운 체험을 제공할 것이다.
    vue-cli 덕분에 독립형 Vue 구성 요소를 테스트할 수 있습니다.

    결론


    일부 비동기 자원과 사용자의 상호작용과 관련된 흔한 문제는 매우 복잡한 모델을 통해 해결할 수 있지만, 다행히도 이 모델은 wasync 패키지의 유니버설 라이브러리로 분해되었다.
    이것은 간단한 Vue 구성 요소에서 실제 응용되었다. 이 구성 요소의 코드는 매우 간단하고 실제적으로 당신이 생산에서 사용하는 코드에 매우 가깝다.
    그것은 몇 가지 항목의 경험에서 비롯되었는데, 이 항목들은 결국 하나의 라이브러리로 분해되었다.나는 모두가 이 점에 대한 피드백을 받고 싶다. 다른 이미 사용된 해결 방안을 원한다. 만약 당신이 그것을 당신의 수요에 응용할 수 있다고 생각한다면!

    좋은 웹페이지 즐겨찾기