commit | 94fbcd6b353a2bee951596acc40a82adaebe048b | [log] [tgz] |
---|---|---|
author | Sean Eagan <seaneagan1@gmail.com> | Thu Jan 08 12:49:03 2015 -0600 |
committer | Sean Eagan <seaneagan1@gmail.com> | Thu Jan 08 12:49:03 2015 -0600 |
tree | 42e621bf9b4a675f7c53739f8d8fea2ecb6dac32 | |
parent | f432de0fa1e031b701ade801d4ca0a29c8e5bfbf [diff] |
Fix badges
It's often useful to provide sync (convenient) and async (concurrent) versions of the same API. dart:io
does this with many APIs including Process.run and Process.runSync. Since the sync and async versions do the same thing, much of the logic is the same, with just a few small bits differing in their sync vs. async implementation.
The when
function allows for registering onSuccess
, onError
, and onComplete
callbacks on another callback which represents that sync/async dependent part of the API. If the callback is sync (returns a non-Future
or throws), then the other callbacks are invoked synchronously, otherwise the other callbacks are registered on the returned Future
.
For example, here's how it can be used to implement sync and async APIs for reading a JSON data structure from the file system with file absence handling:
import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:when/when.dart'; /// Reads and decodes JSON from [path] asynchronously. /// /// If [path] does not exist, returns the result of calling [onAbsent]. Future readJsonFile(String path, {onAbsent()}) => _readJsonFile( path, onAbsent, (file) => file.exists(), (file) => file.readAsString()); /// Reads and decodes JSON from [path] synchronously. /// /// If [path] does not exist, returns the result of calling [onAbsent]. readJsonFileSync(String path, {onAbsent()}) => _readJsonFile( path, onAbsent, (file) => file.existsSync(), (file) => file.readAsStringSync()); _readJsonFile(String path, onAbsent(), exists(File file), read(File file)) { var file = new File(path); return when( () => exists(file), (doesExist) => doesExist ? when(() => read(file), JSON.decode) : onAbsent()); } main() { var syncJson = readJsonFileSync('foo.json', onAbsent: () => {'foo': 'bar'}); print('Sync json: $syncJson'); readJsonFile('foo.json', onAbsent: () => {'foo': 'bar'}).then((asyncJson) { print('Async json: $asyncJson'); }); }