2015-08-08 86 views
1

我想這飛鏢:爲什麼不設置VAR(DART)

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

class testHandler { 

    Map parsedJSON; 

    testHandler(); 

    void Initialize(){ 
    String rawJSON = "core/testConfiguration.json"; 

    HttpRequest.getString(rawJSON) 
    .then((String f) => parsedJSON.from(JSON.decode(f))) 
    .catchError((Error e) => print(e.toString())); 

    print(parsedJSON); 
    } 
} 

如果你看到我設置parsedJSON.then()但是當我試圖讓VAR它會返回null。

+0

還有了'鏢async'標記下了很多類似的問題。 –

回答

2

print(parsedJSON);getString()返回之前執行。 getString()是異步的,傳遞給then()的回調有時會在getString()返回結果後立即執行,但print(parsedJSON);將立即執行。

使用async/await使這很容易:

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

class testHandler { 

    Map parsedJSON; 

    testHandler(); 

    Future Initialize() async { 
    String rawJSON = "core/testConfiguration.json"; 

    try { 
     String f = await HttpRequest.getString(rawJSON); 
     parsedJSON = JSON.decode(f); 
    } catch(Error e) { 
     print(e.toString()); 
    } 

    print(parsedJSON); 
    } 
} 

異步是會傳染的,因此代碼中調用Initialize()必須等待它完成爲好。

+0

謝謝隊友,我怎麼告訴你,我在學習飛鏢,我還在學習飛鏢中的異步編程,現在我已經明白了我的錯誤。 –

+0

如果這回答您的問題,請將其標記爲已回答,並使用upvote按鈕下方的複選標記。有關Dart中的異步編程的更多信息,請參閱https://www.dartlang.org/articles/await-async/ https://www.dartlang.org/docs/tutorials/futures/ https://www.dartlang.org/docs/tutorials/streams/https://www.dartlang.org/articles/beyond-async/ –

+0

我還有一個問題,我如何從另一個類訪問parsedJSON,並從其他類的parsedJSON設置其他變量? –

0

不,您沒有在.then()中設置parsedJSON。您正嘗試從空對象調用方法。使用parsedJSON之前,您應該與=運營商設置它,就像

parsedJSON = new Map.from(JSON.decode(f)); 

換句話說,你混了parsedJSON的方法和地圖的構造函數。

P.S. 而且,由於甘表示,你可以很快把它寫:

parsedJSON = JSON.decode(f); 
相關問題