2015-08-08 2 views
1

Я пытаюсь это Dart:Почему не установить вар (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(), но когда я пытаюсь получить вар , он возвращает 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

Если это ответит на ваши вопросы, отметьте это как указано с помощью галочки под кнопками «вверх». Для получения дополнительной информации об асинхронном программировании в 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

Нет, вы не устанавливаете parsedJSON в .then(). Вы пытаетесь вызвать метод из нулевого объекта. Перед использованием parsedJSON вы должны установить его с = оператора, как

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

Другими словами, вы перепутали методы parsedJSON в и конструкторы карты.

P.S. И, как Гюнтер обозначаться, вы можете записать его в ближайшее время:

parsedJSON = JSON.decode(f); 
Смежные вопросы