【问题标题】:Why don't set the var (Dart)为什么不设置 var (Dart)
【发布时间】:2015-08-08 18:21:09
【问题描述】:

我正在 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);
  }
}

如果您看到我在 .then() 中设置了 parsedJSON,但是当我尝试获取 var 时,它返回 null。

【问题讨论】:

  • dart-async标签下有很多类似的问题。

标签: dart dart-async


【解决方案1】:

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() 的代码也必须等待它完成。

【讨论】:

  • 谢谢伙计,我告诉你,我正在学习 dart,我还在学习 dart 中的异步编程,现在我明白我的错误了。
  • 如果这回答了您的问题,请使用投票按钮下方的复选标记将其标记为已回答。有关 Dart 中异步编程的更多信息,请参阅dartlang.org/articles/await-asyncdartlang.org/docs/tutorials/futuresdartlang.org/docs/tutorials/streamsdartlang.org/articles/beyond-async
  • 我还有一个问题,如何从另一个类访问 parsedJSON 并使用另一个类的 parsedJSON 设置其他变量?
  • var th = new testHandler(); th.parsedJSON = {'x':'y'};这是你要的吗?
  • 不完全是,我试图使用解析的 json,在另一个类中使用它们,例如,我将编写一个函数来返回已经解析的 json 的一些数据,但在另一个类中。
【解决方案2】:

不,您没有在.then() 中设置parsedJSON。您正在尝试从空对象调用方法。在使用parsedJSON 之前,你应该使用= 操作符来设置它,比如

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

换句话说,你混淆了 parsedJSON 的方法和 Map 的构造函数。

附言 而且,正如 Gunter 所说,您可能很快就会写出来:

parsedJSON = JSON.decode(f);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-17
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2017-10-12
    • 2013-01-08
    相关资源
    最近更新 更多