可以用Dart语言编写类似的代码吗?
int i;
try {
i = await getResultAsync();
} catch(exception) {
// Do something
}
Run Code Online (Sandbox Code Playgroud) Dart允许链接期货按顺序调用多个异步方法而不嵌套回调,这很棒.
假设我们想首先连接到像Redis这样的数据存储,然后运行一堆顺序读取:
Future<String> FirstValue(String indexKey)
{
return RedisClient.connect(Config.connectionStringRedis)
.then((RedisClient redisClient) => redisClient.exists(indexKey))
.then((bool exists) => !exists ? null : redisClient.smembers(indexKey))
.then((Set<String> keys) => redisClient.get(keys.first))
.then((String value) => "result: $value");
}
Run Code Online (Sandbox Code Playgroud)
四种异步方法,但代码相当容易阅读和理解.几乎看起来步骤是同步并按顺序执行的.美丽!(想象一下,必须使用嵌套的JavaScript回调编写相同的代码......)
不幸的是,这不会很有效:我们从.connect方法中获得的RedisClient 仅被分配给一个局部变量,该变量不在后续.thens的范围内.所以,redisClient.smembers和redisClient.get实际上将抛出一个空指针异常.
显而易见的解决方法是将返回值保存在具有函数范围的另一个变量中:
Future<String> FirstValue(String indexKey)
{
RedisClient redisClient = null;
return RedisClient.connect(Config.connectionStringRedis)
.then((RedisClient theRedisClient)
{
redisClient = theRedisClient;
return redisClient.exists(indexKey);
})
.then((bool exists) => !exists ? null : redisClient.smembers(indexKey))
.then((Set<String> keys) => redisClient.get(keys.first))
.then((String …Run Code Online (Sandbox Code Playgroud) Future readData() {
var completer = new Completer();
print("querying");
pool.query('select p.id, p.name, p.age, t.name, t.species '
'from people p '
'left join pets t on t.owner_id = p.id').then((result) {
print("got results");
for (var row in result) {
if (row[3] == null) {
print("ID: ${row[0]}, Name: ${row[1]}, Age: ${row[2]}, No Pets");
} else {
print("ID: ${row[0]}, Name: ${row[1]}, Age: ${row[2]}, Pet Name: ${row[3]}, Pet Species ${row[4]}");
}
}
completer.complete(null);
});
return completer.future;
}
Run Code Online (Sandbox Code Playgroud)
以上是从github SQLJocky Connector获取的示例代码
我想有人解释我如果可能的话,为什么是具有之外,那么pool.query被调用函数completer.complete(空)创建的完成者对象的功能.
总之,我无法理解打印执行后的部分.
注意:如果可能的话,我也想知道未来和Completer如何用于DB和非DB操作的实际用途.
我已经探讨了以下链接: …
我不理解该then()条款的语法.
1. myFuture(6).then( (erg) => print(erg) )
What's (erg) => expr语法?
我认为它可能是一个功能,但是
then( callHandler2(erg)
Run Code Online (Sandbox Code Playgroud)
不起作用,错误:
"Multiple markers at this line
- The argument type 'void' cannot be assigned to the parameter type '(String) ->
dynamic'
- Undefined name 'erg'
- Expected to find ')'"
Run Code Online (Sandbox Code Playgroud)
2. myFuture(5).then( (erg) { callHandler(erg);},
onError: (e) => print (e)
What´s `onError: (e) => expr"` syntactically?
Run Code Online (Sandbox Code Playgroud)
3.变体onError:和.catchError(e)变体之间有区别吗?
是否可以设置测试可以运行的最长时间?就像:
@Test(timeout=1000)
public void testSomething() {}
Run Code Online (Sandbox Code Playgroud)
在 jUnit 中?
我想从异步函数返回一个String,但我得到一个Future我做错了什么;
例
main() {
String s;
s = dummy("http://www.google.com");
}
String dummy(String s) {
String response;
response = readURL(s);
return response;
}
Future<String> readURL(String requestString) async {
String response = await http.read(requestString);
print(response);
return response;
}
Run Code Online (Sandbox Code Playgroud)
错误:
type'_Future'不是'response'类型'String'的子类型.
更新(2020 年 7 月 15 日)
目前,mFeinstein 的回答是唯一给我第一个可接受的解决方案的答案。
题
我不得不问你做我想做的事情的最佳方法是什么:
所有这一切都没有冻结进度动画,就像不确定的进度条。
第一点和第二点没有问题。问题出现在第三次,当大量数据库插入在起作用时。我还不明白实现这些东西的正确方法是什么。
一些伪代码用于澄清
UI(显示对话框并运行进度条...)
void callWS() async {
MyProgressDialog _dialog = DialogHelper.showMyProgressDialog(_context, "Data", "Loading...");
await getDataFromService();
_dialog.close();
}
Run Code Online (Sandbox Code Playgroud)
连接(进度条上不会发生冻结)
static Future<void> getDataFromService() async {
String uri = MY_URI;
String wsMethod = MY_WS_METHOD;
String wsContract = MY_WS_CONTRACT;
SoapObject myRequest = SoapObject.fromSoapObject(namespace: my_namespace, name: wsMethod);
MyConnectionResult response = await _openMyConnection(myRequest, uri, wsContract, wsMethod);
if (response.result == MyResultEnum.OK) {
await _parseResponse(response.data);
}
}
Run Code Online (Sandbox Code Playgroud)
DATABASE(冻结发生在进度条上)
static …Run Code Online (Sandbox Code Playgroud) 假设在 Flutter 应用程序中,我们希望在顶层捕获任何未捕获的异常/错误,因此我们按照文档执行此操作:
main() {
// All uncaught errors thrown from synchronous code blocks will end up here:
FlutterError.onError = (FlutterErrorDetails details) {
MyLogger.instance.logUncaughtErrorSync(details);
};
// All uncaught errors thrown from async code blocks will end up here:
PlatformDispatcher.instance.onError = (Object error, StackTrace stack) {
MyLogger.instance.logUncaughtErrorASync(error, stack);
return true;
};
runApp(const MyApp());
Run Code Online (Sandbox Code Playgroud)
虽然文档似乎暗示两者之间的区别在于错误是否源自 Dart(特别是“Flutter”)代码与平台(Android/IOS)代码,但通过我的测试,我可以看出两者之间的唯一区别是对象(错误)是否是从异步或同步 Dart 代码中抛出的。
例如,如果在Dart代码(不是平台代码)中,我们只需输入:
_function() async {
throw('error');
}
Run Code Online (Sandbox Code Playgroud)
我们称之为该函数,它将通过“平台调度程序”冒泡并被视为“平台错误”,但似乎只是因为它发生在后台线程上?
实际上似乎没有任何机制允许从 Java 或 Swift 代码抛出异常来触发这些 onError 函数。
但肯定不止于此,那么拥有两种独立的机制(具有不同的输入——FlutterErrorDetails 与 Object+StackTrace)有什么意义……真正的区别是什么?
error-handling dart dart-async flutter flutter-platform-channel
我正在编写一些集成测试,这些测试使用了一个HttpServer,一堆Directory().watch()'ers 和可能的其他一些未来/流监听代码。
我正在使用以下测试配置:
class LaserServerTestConfiguration extends SimpleConfiguration {
LaserServer _server;
LaserServerTestConfiguration(this._server);
void onDone(bool success) {
super.onDone(success);
_server.stop();
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试如下所示:
main() {
var conf = new LaserConfiguration.fromPath('test/test_config.yaml');
var server = new LaserServer(conf);
unittestConfiguration = new LaserServerTestConfiguration(server);
server.start().then((_) {
test('test file changed event', () {
var response = new Completer<Map>();
response.future.then(expectAsync((e) =>
expect(e, containsValue('test/sample/sample_test.html'))
));
WebSocket.connect("ws://localhost:2014").then((ws) {
ws.listen((msg) {
response.complete(JSON.decode(msg));
ws.close();
});
new File('test/sample/sample.dart').writeAsString("");
});
});
});
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,在测试运行(并通过)之后,Dart VM 没有退出。大概是因为我在事件队列中仍有待处理的内容。
如何调试事件队列?我想看看是什么阻止了 Dart VM 在测试运行结束时退出。
您可以在自定义 TestConfiguration …
我最近看到了一些像下面这样的代码示例
Future<Null> ensureLogin() {...}
var login = ensureLogin();
Future functionA() async {
await login;
print("FunctionA finished");
}
Future functionB() async {
await login;
print("FunctionB finished");
}
void main() {
functionA();
functionB()
}
Run Code Online (Sandbox Code Playgroud)
当 future 完成时,它会打印如下:
FunctionA finished
FunctionB finished
Run Code Online (Sandbox Code Playgroud)
看起来我们可以对同一个未来对象有多个等待?但这到底是如何运作的呢?它相当于 Future 是什么?也许像下面这样?
login.then(functionA).then(fucntionB)
Run Code Online (Sandbox Code Playgroud)