dart
비동기 프로그래밍
수색…
완성품을 사용하여 미래를 되돌아 감
Future<Results> costlyQuery() {
var completer = new Completer();
database.query("SELECT * FROM giant_table", (results) {
// when complete
completer.complete(results);
}, (error) {
completer.completeException(error);
});
// this returns essentially immediately,
// before query is finished
return completer.future;
}
비동기 및 대기
import 'dart:async';
Future main() async {
var value = await _waitForValue();
print("Here is the value: $value");
//since _waitForValue() returns immediately if you un it without await you won't get the result
var errorValue = "not finished yet";
_waitForValue();
print("Here is the error value: $value");// not finished yet
}
Future<int> _waitForValue() => new Future((){
var n = 100000000;
// Do some long process
for (var i = 1; i <= n; i++) {
// Print out progress:
if ([n / 2, n / 4, n / 10, n / 20].contains(i)) {
print("Not done yet...");
}
// Return value when done.
if (i == n) {
print("Done.");
return i;
}
}
});
Dartpad의 예보기 : https://dartpad.dartlang.org/11d189b51e0f2680793ab3e16e53613c
콜백을 선물로 변환
Dart에는 Future , Stream 등의 강력한 비동기 라이브러리가 있습니다. 그러나 Futures 대신 콜백 을 사용하는 비동기 API를 실행하는 경우가 있습니다. 콜백과 Futures 간의 갭을 메우기 위해 Dart는 Completer 클래스를 제공합니다. Completer를 사용하여 콜백을 미래로 변환 할 수 있습니다.
Completer는 콜백 기반 API를 Future 기반 API와 연결하는 데 적합합니다. 예를 들어 데이터베이스 드라이버가 선물을 사용하지 않지만 미래를 반환해야한다고 가정합니다. 이 코드를보십시오 :
// A good use of a Completer.
Future doStuff() {
Completer completer = new Completer();
runDatabaseQuery(sql, (results) {
completer.complete(results);
});
return completer.future;
}
이미 Future를 반환하는 API를 사용하는 경우 Completer를 사용할 필요가 없습니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow