所以我一直在试验DART(我的核心语言是C++和嵌入式C派生)。因此,我的代码可能并不漂亮,因为我更像是程序员程序员,但我正在学习和学习......我一直在等待同步的期货问题上挣扎,基本上,我根本无法获得DART等待。以下代码建立与小型嵌入式设备的套接字连接并提取信息。这一切都有效,但注意到操作顺序应该是main()从控制台获取一些信息,然后调用方法cardStatus运行,并通过套接字连接从嵌入式设备获取信息。这是等待发生的地方。当Future返回时,它应该转到printstuff()方法。我补充说,应该去为了读打印语句:DART异步/等待不等待
- 这应该打印第一
- 这应该打印第二
- 这应该打印3
而是因为等待是不发生在cardstatus呼叫(这很费时),我得到:
- 这应该打印第1
- 这应该打印3
- 这应该打印第二
我跟着就利用异步的另一个线程,而且似乎用这个Other thread的一个坚实的方式至少以下(我尝试了。然后用一个类似的结果完成,所以有一些核心,我觉得我失踪)..但我一直坚持这一个星期。
下面的代码以及控制台输出。
import 'dart:io';
import 'dart:async' show Future;
const String STATUS = "#111111;";
String defaultIP = "10.1.14.202";
int defaultConfigPort = 5111;
int defaultControlPort = 6722;
var card = new Map();
getInput(String defaults) {
String takenin = stdin.readLineSync();
if (takenin == '') takenin = defaults;
return takenin;
}
Future main() async {
stdout.write('What is the IP address of the card ($defaultIP): ');
String ipaddress = getInput(defaultIP);
defaultIP = ipaddress;
print ("This should print 1st");
stdout.writeln("Connecting to $defaultIP");
await cardStatus(defaultIP, defaultConfigPort, STATUS, card);
printstuff();
}
printstuff() {
stdout.writeln(card['subnet']);
print ("This should print 3rd");
}
Future cardStatus(String ip, int port, String message, Map card) {
return new Future.delayed(Duration.ZERO,() {
Socket.connect(ip, port).then((socket) {
print('Connected to: '
'${socket.remoteAddress.address}:${socket.remotePort}');
socket.listen((data) {
print(new String.fromCharCodes(data).trim());
List str1 = (new String.fromCharCodes(data).trim().split(','));
print(str1);
print ("This should print 2nd");
//var card = new Map();
card['ip'] = str1[0];
card['subnet'] = str1[1];
card['gateway'] = str1[2];
card['unknown'] = str1[3];
card['persist'] = str1[4] == 'true';
card['build'] = str1[5];
card['serial'] = str1[6].substring(0, 14);
card['cloudpassword'] = str1[6].substring(14, 20);
card['DNS'] = str1[7];
card['cloudhost'] = str1[8];
card['cloudenabled'] = str1[9] == 'true';
print(card['ip']);
},
onDone:() {
print("Done");
socket.destroy();
});
//Send the request
socket.write(message);
});
});
}
并且这是当前的控制台输出。注意,如果cardStatus已经完成,null将不会为null,它将被打印为str1。
What is the IP address of the card (10.1.14.202):
This should print 1st
Connecting to 10.1.14.202
null
This should print 3rd
Connected to: 10.1.14.202:5111
>10.1.14.202,255.255.255.0,10.1.14.1,,0,435,F44900A60040F8000000,192.168.1.1,connect.tutuuu.com,0;
[>10.1.14.202, 255.255.255.0, 10.1.14.1, , 0, 435, F44900A60040F8000000, 192.168.1.1, connect.tutuuu.com, 0;]
This should print 2nd
10.1.14.202
Done
Process finished with exit code 0
感谢您的帮助!
请在发布一个简单的例子未来,大部分对你的问题并不感兴趣。 – rkj
没问题。对于那个很抱歉。 – mumcs01