2017-05-08 5 views
1

일련의 물건을 반환하는 JS 생성기 함수를 갖고 싶습니다. 저녁 식사에 대한 제안을 말씀 드리겠습니다. 어떤 요리의 이름을 알고 있지만, 내가 좋아하지 않으면 원격 서버에서 더 많은 제안을 가져와야합니다. 그래서 나는이 일을하고 싶습니다 : 나는 내부 함수에서 얻을 수 없기 때문에비동기 적으로 작동하는 생성자 함수

const dishSuggestions = function*(){ 
    yield "pancakes"; 
    yield "pizza"; 
    fetchMealSuggestions().then(suggestions => { // Or even better await. 
    for (const suggestion of suggestions) 
     yield suggestion; 
    }); 
}; 

이것은 분명히 작동하지 않습니다. 그래서 내 질문은 : 어떻게 그 행동을 얻는가? 그럴 수있어? 아니면 잘못된 도구입니까?

+0

[이 비동기식 콜백을 생성기로 어떻게 변환 할 수 있습니까?] (http://stackoverflow.com/q/29280189/1048572) - 대답은 '아니오'입니다. 약속 및 반복자는 (현재)있을 수 없습니다 혼합. – Bergi

답변

2

이 상황에서 이론적으로 원하는 것은 비동기 반복기가 포함 된 비동기 생성기입니다. 여기

는이 보일 것이다 방법은 다음과 같습니다

// Note the * after "function" 
async function* dishSuggestions() { 
    yield "pancakes"; 
    yield "pizza"; 

    // async iteration: yield each suggestion, one after the other 
    for await (const meal of fetchMealSuggestions()) { 
    yield meal; 
    } 
} 

async function logDishes() { 
    for await (const dish of dishSuggestions()) { 
    console.log(dish); 
    } 
} 

logDishes(); 

가 여기 working transpilled demo with Babel입니다.

fetchMealSuggestions도 비동기 반복이 작동하려면 비동기 반복기를 반환해야합니다.

이것은 아직까지 각 브라우저에서 발송되기 시작한 아주 새로운 기능입니다. 지금은

More details

는 의견에 question Bergi recommended를보십시오.

+1

이것은 좋은 해결책입니다. – trincot

+1

비동기 생성기가 API에서 표준이되기를 기대합니다. 스트림 기반 작업을 약속 영역으로 가져 오는 매우 강력하고 간결한 방법입니다. –

관련 문제