Возможно ли заблокировать вызов функции, который возвращает будущее?Создание будущего блока до его завершения
Я был под впечатлением от звонка .then()
, но это не то, что я вижу в своем выпуске.
print("1");
HttpRequest.getString(url).then((json) {
print("2");
});
print("3");
Что я вижу в моем выходе:
1
3
2
Метод getString
не имеет async
, который позволил бы мне await
его и then
выполняет асинхронно в любом случае.
static Future<String> getString(String url,
{bool withCredentials, void onProgress(ProgressEvent e)}) {
return request(url, withCredentials: withCredentials,
onProgress: onProgress).then((HttpRequest xhr) => xhr.responseText);
}
Как сделать блокированию без размещения бесконечного времени цикла перед пунктом 3 ждет шага 2 будет завершен (не то, что он будет работать в любом случае из-за одного потоком природы Dart)?
выше HttpRequest загружает config.json
файл, который определяет, как все работает в приложении, если запрос на поле в конфигурации выполняется до того, как файл config.json
выполняется загрузка, это приводит к ошибкам, так что нужно ждать, пока файл загружается, прежде чем я разрешу вызывать геттеры в полях класса, или геттерам нужно ждать однократной загрузки файла config.json
.
Update, это то, что я в конце концов сделал, чтобы заставить его работать после того, как Гюнтер предложил мне использовать Completer
:
@Injectable()
class ConfigService {
Completer _api = new Completer();
Completer _version = new Completer();
ConfigService() {
String jsonURI =
"json/config-" + Uri.base.host.replaceAll("\.", "-") + ".json";
HttpRequest.getString(jsonURI).then((json) {
var config = JSON.decode(json);
this._api.complete(config["api"]);
this._version.complete(config["version"]);
});
}
Future<String> get api {
return this._api.future;
}
Future<String> get version {
return this._version.future;
}
}
И где я использую ConfigService
:
@override
ngAfterContentInit() async {
var api = await config.api;
var version = await config.version;
print(api);
print(version);
}
Теперь я получаю блокирующие функции без фактического блокирования.
Ммм, довольно рассол! Внутри загружаемого json-файла есть URL-адрес, который мне нужно загрузить в ConfigService. NG2 загружается так быстро, что к тому времени, когда он начнет обстрелы RPC на этот URL для данных, файл 'config.json' все еще загружается, вызывая 404 ошибки. –