2017-09-22 127 views
0

我試圖把json數據放入一個變量中。當我打印jsondata時,爲什麼會變爲NULL?Dart HTTP請求變量

當我更改jsondata打印似乎工作正常,當我使用類型命令它確認它作爲一個列表。那麼當我傳遞給變量時,我做錯了什麼?

HttpRequest.getString('file.json').then(
(result) => print(JSON.decode(result))); //this prints fine as type list 

回答

1

HttpRequest.getString是,也就是說,它不會立即執行 - 它在未來執行一段時間(和返回類型是,作爲回報,Future<String>)。考慮下面的程序:

print('1'); 
getData().then((data) => print('2')); 
print('3'); 

在正常運行的飛鏢運行,這將從未打印「1」「2」「3」,而是將打印「1」,「3」和也許打印「2」如果getData()完成(即沒有錯誤發生,沒有超時/互聯網連接問題)。

達特(和其他語言)添加await關鍵字,使其更容易編寫同步程序(即不使用的「後」之稱的嵌套回調),但在其他方面表現得完全一樣,以前的代碼:

print123() async { 
    print('1'); 
    await getData(); 
    print('2'); 
    print('3'); 
} 

將上面的代碼,如果表現良好(再次,沒有超時等),打印「1」「2」「3」 - 正是你所期望的。現在,讓我們運用同樣的模式到你上面的代碼:

import 'dart:html'; 
import 'dart:convert'; 

var jsondata; 

main() async { 
    jsondata = JSON.decode(await HttpRequest.getString('file.json')); 
    print(jsondata); 
} 

你不使用await/async,但我覺得更容易的大部分時間!如果您想保留當前的代碼,確保jsondata分配之後調用print

main() { 
    HttpRequest.getString('file.json').then((data) { 
    jsondata = JSON.decode(data); 
    print(jsondata); 
    }); 
} 
+0

謝謝你,你的解釋是非常有益的。 –