所以我一直在試驗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