2016-05-31 2 views
1

을 기다리는 것과 같습니다. Dart의 await for 구조가 마음에 듭니다.다트 스트림

일반 for 루프와 비슷한 것을 어떻게 구현할 수 있습니까?

// beware! fictional code. 
var element = stream.next(); 
for(; stream.isEndReached(); element = stream.next()) { 
    // use element here 
} 

// or probably it will be like this, right? 
var element = await stream.next(); 
for(; await stream.isEndReached(); element = await stream.next()) { 
    // use element here 
} 

같은

뭔가하지만 기능 대신 여기 next()isEndReached()의 사용에 무엇을 알아낼 수 없습니다. async for과 똑같이 작동하는 예제를 나에게 줄 수 있다면 좋을 것입니다.

편집 : 나는 이런 식으로 뭔가를 할 :

if (!stream.isEndReached()) { 
    var a = await stream.next(); 
    // use a 
} 

if (!stream.isEndReached()) { 
    var b = await stream.next(); 
    // use b 
} 

// have an arbitrary number of these 

나는 항목이 같은 하나씩을 소비 할 필요가 여기에이 요청 실제 이유는. 이것이 바로 내가 만든 .next().isEndReached() 메쏘드가 스트림 클래스의 실제 메쏘드에 맵핑되는 것을 묻는 이유입니다.

+0

참조 http://stackoverflow.com/questions/24437673/using-loops-with-futures-in-dart –

+0

그래서 .forEach가있는 폐쇄를 사용하는 것이 유일한 옵션입니까? 내가 말한 것은 가능하지 않지, 그렇지? –

+1

하나가 다른 하나를 실행하게하려면 호출을'then()'으로 묶어야합니다. 나는 이것을 for 루프로 할 방법이 없다. –

답변

2

async 패키지에는 원하는대로 할 수있는 StreamQueue 클래스가 포함되어 있습니다.

http://news.dartlang.org/2016/04/unboxing-packages-async-part-3.html

StreamQueue은 스트림 풀 기반의 API를 제공하는이 위대한 문서를 참조하십시오.

void main() async { 
    var queue = new StreamQueue(new Stream.fromIterable([1, 2, 3])); 
    var first = queue.next; 
    var second = queue.next; 
    var third = queue.next; 
    print(await Future.wait([first, second, third])); // => [1, 2, 3] 
} 

갱신

WebStorm 위에서 언급 한 기사에서 냈다 코드입니다은 아무것도 아직 수입되지 않은 경우 수입에 대한 빠른 수정 사항을 제공하지 않습니다합니다 (dartanalyzer의 기능을 사용합니다) 꾸러미. 소스 코드에서 언급되지 않은 패키지는 읽지 않습니다. 내 대답에 언급 된대로 StreamQueueasync 패키지입니다. 보통 import 'package:async/async.dart';이면 충분합니다 (패키지의 기본 진입 점 파일 (async.dart)을 패키지와 동일하게 지정하는 것이 관례입니다). 내 보낸 모든 식별자는 라이브러리에서 사용할 수있게됩니다. 그렇지 않으면 프로젝트 소스를 검색 할 수 있으며 WebStorm은 종속성을 검색하고 어떤 라이브러리에 StreamQueue 클래스가 포함되어 있는지 보여줍니다. 그런 다음이 파일을 가져올 수 있습니다.

+0

StreamQueue를 사용하려면 https://github.com/dart-lang/async/blob/master/test/stream_queue_test.dart 코드를 찾아서'import '패키지를 붙여 넣어야했습니다 : async/async.dart "show StreamQueue;"를 내 수입으로 가져옵니다. 나는 WebStorm을 사용하고 있으며 StreamQueue와 함께 ctrl + space는 StreamQueue를 자동으로 가져 오지 않았습니다. StreamQueue를 사용하여 시작할 수있는 쉬운 방법이 있습니까? –