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;
}
Async और Await
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;
}
}
});
डार्टपैड पर उदाहरण देखें: https://dartpad.dartlang.org/11d189b51e0f2680793ab3e16e53613c
वायदा करने के लिए कॉलबैक परिवर्तित
डार्ट में फ्यूचर , स्ट्रीम , और बहुत कुछ के साथ एक मजबूत एसिंक्स लाइब्रेरी है। हालांकि, कभी-कभी आप एक अतुल्यकालिक एपीआई में भाग ले सकते हैं जो फ्यूचर्स के बजाय कॉलबैक का उपयोग करता है। कॉलबैक और फ्यूचर्स के बीच की खाई को पाटने के लिए, डार्ट Completer वर्ग प्रदान करता है। कॉलबैक को फ्यूचर में बदलने के लिए आप कंप्लीटर का उपयोग कर सकते हैं।
पूर्णांक फ्यूचर-आधारित API के साथ कॉलबैक-आधारित API को ब्रिज करने के लिए बहुत अच्छा है। उदाहरण के लिए, मान लें कि आपका डेटाबेस ड्राइवर फ्यूचर्स का उपयोग नहीं करता है, लेकिन आपको फ्यूचर वापस करने की आवश्यकता है। इस कोड को आज़माएं:
// A good use of a Completer.
Future doStuff() {
Completer completer = new Completer();
runDatabaseQuery(sql, (results) {
completer.complete(results);
});
return completer.future;
}
यदि आप ऐसे API का उपयोग कर रहे हैं जो पहले से ही Future लौटाता है, तो आपको पूर्णक का उपयोग करने की आवश्यकता नहीं है।