[EcmaScript] async/await

3260 단어
asyncawait은 ES7의 제안입니다.
많은 제3자 라이브러리는 이를 yield+promise의 문법당의 형식으로 실현했다.그러나 그들은 본질적으로 yield에만 의존하면 충분하다promise는 일종의 용법일 뿐이다.

(1)async와await

async function say(greeting){
    return new Promise(function(resolve,then){
        setTimeout(function(){
            resolve(greeting);
        },1500);
    });
}

(async function(){
    var v1=await say('Hello');
    console.log(v1);

    var v2=await say('World');
    console.log(v2);
}());

(2)yield+promise의 문법 설탕


용례:
yieldPromise(function*(){
    var v1=yield new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve('Hello');
        },1500);
    });

    console.warn(v1);

    var v2=yield new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve('World');
        },1500);
    });

    console.warn(v2);
});

구현:
function yieldPromise(generator){
    var iterator=generator();
    recursiveCore.call(iterator);
}

function recursiveCore(feedback){
    var iterator=this,
        result=iterator.next(feedback);

    if(result.done){
        return;
    }

    var promise=result.value;
    Promise.resolve(promise).then(function(v){
        recursiveCore.call(iterator,v);
    });
}

이것은 크롬에서 실행할 수 있다.

(3) 핵심은yield


즉,yield로call/cc
용례:
yieldContinuation(function*(){
    var v1=yield function(k){
        setTimeout(function(){
            k('Hello');
        },1500);
    };

    console.warn(v1);

    var v2=yield function(k){
        setTimeout(function(){
            k('World');
        },1500);
    };

    console.warn(v2);
});

구현 방법:
function yieldContinuation(generator){
    var iterator=generator();
    recursiveCore.call(iterator);
}

function recursiveCore(feedback){
    var iterator=this,
        result=iterator.next(feedback);

    if(result.done){
        return;
    }

    varyieldFunc=result.value;
    yieldFunc(function(v){
        recursiveCore.call(iterator,v);
    });
}

이것은 크롬에서도 실행할 수 있다.

(4)promise로 쓰기

yieldContinuation(function*(){
    var v1=yield function(k){
        new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve('Hello');
            },1500);
        }).then(k);
    };

    console.warn(v1);

    var v2=yield function(k){
        new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve('World');
            },1500);
        }).then(k);
    };

    console.warn(v2);
});

이것도 당연히 운행할 수 있어야 한다.

(5) 다른 비동기 리셋 함수로 쓰기


aax
yieldContinuation(function*(){
    var v1=yield function(k){
        sendAjax({
            url:'/',
            success:k
        });
    };

    console.warn(v1);

    var v2=yield function(k){
        sendAjax({
            url:'/',
            success:k
        });
    };

    console.warn(v2);
});

이것은 실현sendAjax된 후에도 당연히 운행할 수 있다.

좋은 웹페이지 즐겨찾기