Dart 와 js 의 비동기 - Future vs Promise
Promise
전단 비동기 프로 그래 밍 에서 중요 한 위 치 를 차지한다.Dart 의 학습 에서 우 리 는 비동기 프로 그래 밍 방식 을 접 했다. 예 를 들 어 사용 Future
, Stream
, Completer
, Timer
등 이다.웹 개발 자 에 게 dart 의 전체 비동기 구 조 는 js 와 매우 비슷 하고 해당 하 는
Event Loop
개념 이 있 기 때문에 우 리 는 js 의 경험 으로 dart 를 이해 하고 학습 할 수 있다. 예 를 들 어 js 중의 Promise
과 dart 중의 Future
이 좋 은 예 이다.Dart 의 비동기
Future
는 js 중의 Promise
와 비슷 하 다.예 를 들 어 js 에서 우 리 는 delay 함 수 를 실현 합 니 다.function delay(ms) {
return new Promise(resolve => {
setTimeout(() => resolve('done'), ms)
)
}
delay(3000).then(val => {
console.log(val);
})
dart 에서 도 이러한 기능 을 실현 할 수 있 으 므 로 빌려 야 한다
Completer
Future delay(int ms) {
final com = Completer();
final future = com.future;
Timer(Duration(milliseconds: ms), () {
com.complete('done');
});
return future;
}
//
delay(3000).then((val){
print(val);
});
그리고
Promise.race
, Promise.all
, then
, catch
, finally
, Promise.resolve
, Promise.reject
등 은 dart Future
에서 모두 해당 하 는 실현 이 있 었 다.// any js Promise.race
Future.any([delay(3000), delay(1500)]).then((_){
print('1.5s ');
});
// wait js Promise.all
Future.wait([delay(3000), delay(1500)]).then((_){
print('3s ');
});
// error catchError js Promise.reject catch
Future.error('error').catchError(print);
// value then js Promise.resolve then
Future.value('value').then(print);
// whenComplete js finally
Future.error('error').whenComplete((){
print('finally');
});
또한, js 중의
Promise
는 async/await
에 호출 할 수 있 으 며, 마찬가지 로 dart 에서 Future
도 async/await
에 호출 할 수 있다.void test() async {
await delay(1000);
print('1s ');
}
물론 Future 에는
Future.microtask
, Future.sync
, Future.delayed
등 다른 고급 기능 도 있다.심지어 우리 가 js 에서
Promise
의 실현 원 리 를 알 고 있다 면 우 리 는 Dart 에서 하나의 Promise
를 만들어 하나의 dart-promise
간단 한 실현 을 공유 할 수 있다.https://github.com/w-rudolph/dart-promise
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.