찾다
웹 프론트엔드JS 튜토리얼ES6에서 Generator는 무엇을 의미합니까? ES6의 제너레이터 소개

이 기사의 내용은 ES6에서 Generator의 의미에 관한 것입니다. ES6의 Generator 도입은 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

Generator in ES6

Generator는 ES6의 매우 흥미로운 기능이면서도 이해하기 쉽지 않은 기능이기도 합니다. 블록 수준 범위를 제공한다는 명백한 목적과 달리 이 것의 목적은 무엇입니까? let/const

먼저 문제를 명확히 해야 합니다. JavaScript에서는 함수가 실행되기 시작하면 실행이 완료될 때까지 중지할 수 없습니다. (나에게 디버깅에 대해 언급하지 마세요. 혹시 그런 사용자를 본 적이 있습니까?) 제품을 사용하고 코드를 디버깅하려면 디버그를 열어야 합니까?

하지만 Generator는 이 기능을 제공합니다. 아래 코드를 보세요:

function *g(){
    console.log('start');
    yield 1;
    console.log('middle');
    yield 2;
    console.log('end');
}
var g1 = g();
console.log(g1.next()); 
// start
// {value: 1, done: false}
console.log(g1.next());  
// middle
// {value: 2, done: false}
console.log(g1.next());  
// end
// {value: undefined, done: true}
출력 결과에 따르면 함수 g에서 Yield 키워드를 만나면 실행 중인 프로그램이 중지되는 것을 볼 수 있습니다. next() 메서드를 호출해야만 함수 g의 코드가 계속 실행됩니다. 따라서 함수 g 자체는 일시 중지된 상태입니다.

이 시점에서 우리는 다음을 알아야 합니다:

  • Generator는 함수도 아니고 함수도 아닙니다.

  • g()는 즉시 실행을 시작하지 않지만 실행이 시작되자마자 일시 중지됩니다.

  • 매번 g1.next()는 일시정지 상태를 깨고 다음 항복 또는 반환을 만날 때까지 실행됩니다.

  • yy가 발생하면 항복 이후의 표현식이 실행되고 실행 후 값이 반환되고 다시 일시 중지된 상태로 들어갑니다. 이때 done: false입니다.

  • return을 만나면 값이 반환되고 실행이 종료됩니다. 즉, done: true

  • g.next()의 매번 반환 값은 항상 {value: ... , done:입니다. ...}

Generator와 비동기

의 형태 Generator는 기능을 중지할 수 있으므로, 머리가 좋은 일부 사람들은 Generator를 비동기 프로그램 처리에 사용할 수 있는지 생각해 보았습니다.

먼저 전통적인 예를 살펴보겠습니다:

    function asyn(fn) {
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                fn();
                resolve(true);
            }, 1000);
        });
    }

    function main() {
        console.log('start');
        asyn(function(d) {
            console.log('async one');
            asyn(function(d) {
                console.log('async two');
                console.log('end');
            });
        });
    }

    main();
그런 다음 Generator를 사용하는 비동기 프로그램을 살펴보겠습니다.

    function asyn(fn) {
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                fn();
                resolve(true);
            }, 1000);
        });
    }

    co(function*() {
        console.log('start');
        yield asyn(function(d) {
            console.log('async one');
        });

        yield asyn(function(d) {
            console.log('async two');
        });
        console.log('end');
    });

    function co(fn) {

        return new Promise((resolve,reject)=>{
            let g = fn();

            onFullfilled();
            function onFullfilled() {
                let ret = null;
                ret = g.next();
                next(ret);
            }

            function next(ret) {
                if(ret.done) return resolve(ret.value);
                ret.value.then(onFullfilled);
            }
        } );
    }
함수는 비동기 프로그램에서 중첩된 콜백을 사용하지 않고 동기 방식으로 직접 작성됩니다. 원칙은 아마도 두 개의 비동기 프로그램이 있고 이를 참조하는 데 Xiao Ming과 Xiao Hong이 사용된다는 것입니다. Xiaohong은 Xiaoming이 실행되기 전에 실행이 완료될 때까지 기다려야 합니다. 그런 다음 Xiaoming을 실행할 때 프로그램 실행을 일시 중지하고(yield를 통해) Xiaoming가 결과를 반환할 때까지 기다린 후 다음 Xiaohong(next()를 실행합니다. ).

위 프로그램에서 co 함수를 추가했습니다. 이 함수의 기능은 Generator가 자동으로 실행되도록 하는 것입니다. 직설적으로 말하면 첫 번째 비동기 함수가 반환되면 next() 메서드가 자동으로 호출되어 다음 코드를 실행합니다.

Generator 및 Koa

Koa는 Node.js 기반의 웹 애플리케이션 프레임워크입니다. Koa에서 처리되는 비동기 프로그램은 주로 네트워크 요청(HTTP), 파일 읽기 및 데이터 쿼리입니다. 여기에는 비동기 시나리오가 많이 있습니다. 프로그램 계층화를 추가하고 기존 콜백 방법을 사용하면 콜백이 너무 많아집니다.

app.on('get', function(){
    auth(function(){
        router(function(){
            find(function(){
                save(function(){
                    render(function(){
                        //......
                    })
                })
            })
        })
    })

})
이러한 작성 방식은 프로그램 유지 관리에 매우 해롭고 전혀 불편합니다. 생성기를 갖고 나면 위와 같은 방식으로 프로그램을 작성할 수 있습니다. Koa의 원래 버전은 중간 처리 프로그램을 "수율"(미들웨어)로 변환하기 위해 이 방법을 사용했습니다. 미들웨어 형태로 클라이언트 요청을 처리하면 앱 애플리케이션 개발이 더욱 유연해지고 프레임워크 자체에 의해 제한되지 않습니다.

최신 Koa2에서는 Genetator가 폐기되고 대신 async/await를 사용합니다.

그러나 어떤 방법을 사용하더라도 Promise를 사용하는 것이 본질입니다.

위 내용은 ES6에서 Generator는 무엇을 의미합니까? ES6의 제너레이터 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 segmentfault思否에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
es6怎么判断是否为数组es6怎么判断是否为数组Apr 25, 2022 pm 06:43 PM

在es6中,可以利用“Array.isArray()”方法判断对象是否为数组,若判断的对象是数组,返回的结果是true,若判断对象不是数组,返回的结果是false,语法为“Array.isArray(需要检测的js对象)”。

es6中遍历跟迭代的区别是什么es6中遍历跟迭代的区别是什么Apr 26, 2022 pm 02:57 PM

es6中遍历跟迭代的区别是:遍历强调的是要把整个数据依次全部取出来,是访问数据结构的所有元素;而迭代虽然也是依次取出数据,但是并不保证取多少,也不保证把所有的数据取完,是遍历的一种形式。

es6中怎么判断两个对象是否相等es6中怎么判断两个对象是否相等Apr 19, 2022 pm 03:34 PM

在es6中,可用Object对象的is()方法来判断两个对象是否相等,该方法检测两个变量的值是否为同一个值,判断两个对象的引用地址是否一致,语法“Object.is(对象1,对象2)”;该方法会返回布尔值,若返回true则表示两个对象相等。

es6怎么将数字转为字符串es6怎么将数字转为字符串Apr 19, 2022 pm 06:38 PM

转换方法:1、利用“+”给数字拼接一个空字符,语法“数字+""”;2、使用String(),可把对象的值转换为字符串,语法“String(数字对象)”;3、用toString(),可返回数字的字符串表示,语法“数字.toString()”。

es6中assign的用法是什么es6中assign的用法是什么May 05, 2022 pm 02:25 PM

在es6中,assign用于对象的合并,可以将源对象的所有可枚举属性复制到目标对象;若目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性,语法为“Object.assign(...)”

sort排序是es6中的吗sort排序是es6中的吗Apr 25, 2022 pm 03:30 PM

sort排序是es6中的;sort排序是es6中用于对数组的元素进行排序的方法,该方法默认不传参,按照字符编码顺序进行排序,排序顺序可以是字母或数字,并按升序或降序,语法为“array.sort(callback(a,b))”。

es6怎么改变数组数据es6怎么改变数组数据Apr 26, 2022 am 10:08 AM

改变方法:1、利用splice()方法修改,该方法可以直接修改原数组的内容,语法为“数组.splice(开始位置,修改个数,修改后的值)”;2、利用下标访问数组元素,并重新赋值来修改数组数据,语法为“数组[下标值]=修改后的值;”。

import as在es6中的用法是什么import as在es6中的用法是什么Apr 25, 2022 pm 05:19 PM

在es6中,import as用于将若干export导出的内容组合成一个对象返回;ES6的模块化分为导出与导入两个模块,该方法能够将所有的导出内容包裹到指定对象中,语法为“import * as 对象 from ...”。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기