2017-12-02 4 views
0

JS 생성기 주변에서 머리를 감싸려고하고 있지만 아래의 샘플 비동기 연산이 정의되지 않은 이유를 알 수 없습니다.ES6에서 생성기 함수 이해

수익의 전체 지점은 비동기 호출이 완료 될 때까지 대기하는 것이라고 생각했습니다.

function getUsers(){ 
 
\t var users; 
 
\t $.ajax({ 
 
\t url: 'https://jsonplaceholder.typicode.com/users/' 
 
\t }).then(function(users) { 
 
\t console.log(gen.next(users)); 
 
\t }); 
 
\t 
 
} 
 

 
function getPosts(){ 
 
\t var posts; 
 
\t $.ajax({ 
 
\t url: 'https://jsonplaceholder.typicode.com/posts/' 
 
\t }).then(function(posts) { 
 
\t console.log(gen.next(posts)); 
 
\t }); 
 
} 
 

 
function getComments(){ 
 
\t var comments; 
 
\t $.ajax({ 
 
\t url: 'https://jsonplaceholder.typicode.com/comments/' 
 
\t }).then(function(comments) { 
 
\t console.log(gen.next(comments)); 
 
\t }); 
 
} 
 

 
function* myGenerator() { 
 
\t var users = yield getUsers(); 
 
\t var posts = yield getPosts(); 
 
\t var comments = yield getComments(); 
 
\t return ([users, posts, comments]); 
 
} 
 

 
var gen = myGenerator(); 
 
gen.next(); 
 

 
// {value: undefined, done: false} ---> why undefined here? 
 
// {value: undefined, done: false} ---> why undefined here? 
 
// {value: Array(3), done: true} ---> YAY, array DOES contains expected data
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

사람은에 대해 어느 정도의 실마리를 제공 할 수 있습니까? 고맙습니다!

+1

, 당신은 당신의 기능에서 아무것도 반환하지 것입니다. ('then()'을 반환하는 것은 동일하지 않습니다. –

+1

언급 한 것처럼 아약스 함수에서 반환 할 수 없으며 일반적으로 콜백 함수라고하는 다른 함수를 호출해야합니다. 그렇지 않으면 약속의 세계에서 'resolve' 또는'reject'를 호출 할 필요가 있습니다 – Denno

+0

@Mark_M과 당신의 의견을 보내 주셔서 감사합니다. 반환 된 데이터를 생성기로 다시 전달하는 여러 단계를 연결하고 시도하기 위해 위 코드를 편집했습니다. 첫 번째 두 yield 문은 여전히 ​​정의되지 않은 상태로 반환됩니다. – rsilva

답변

1

function getUsers(){ 
 
\t return new Promise((resolve) => { 
 
\t \t $.ajax({ 
 
\t \t url: 'https://jsonplaceholder.typicode.com/users/' 
 
\t \t }).then(function(users) { 
 
\t \t resolve(gen.next(users)); 
 
\t \t }); 
 
\t }); 
 
}

그래서 편집과 상황이 조금 다른 작동합니다. 마지막을 제외한 모든 경우에 함수가 아무 것도 반환하지 않기 때문에 생성기가 함수의 결과를 생성합니다.이 함수는 정의되지 않았습니다.

그러나 next()then() 내부에서 호출하면 생성자에게 ajax 약속의 결과를 전달합니다. 생성기는 해당 값을 수신하여 변수 (users, posts 등)에 저장합니다. 그러나 함수가 아무 것도 반환하지 않기 때문에 yield getPosts() 값이 정의되어 있지 않으므로 undefined를 반환합니다.

next()에 대한 마지막 호출은 then()getComments()에서 발생합니다. 이제 제너레이터의 값이 다르기 때문에 {done: true}과 비동기 적으로 변수에 넣은 값을 반환합니다. 그것들과 당신의 일을 되 돌린다. 당신은 그냥 그랬다면

모든 훨씬 쉬울 것 : 우선 들어

function getUsers(){ 
    return $.ajax({ 
     url: 'https://jsonplaceholder.typicode.com/users/' 
    }) 
} 

getUsers().then(console.log) 
0

나는 이것이 내가 어떻게 유용 할 수 있는지 이해하고 있다고 생각한다. 내가 약속에 getUsers 래핑하고 지금 기대 값을 얻을! 고마워.

+0

'$ .ajax()'는 이미 약속을 반환하지만,이를 반환 할 수 있습니다 (즉,'return $ .ajax ({/ * ... etc * /})))) –

+0

좋은 지적 @Mark_M – rsilva