2016-07-28 4 views
1

Почему результат печати сохраняется «asd»?Использование фьючерсов с червяком

 var jerl = "asd"; 

    HttpRequest.request('Foo', 
    method: "GET", 
    requestHeaders: {"Authorization": "Secret"}).then((x) => x.responseText).then((y) => jerl = y); 

    print(jerl); 
+0

это не похоже на код angularjs .... – Claies

+0

Должно быть, это подсознательно добавлено – BluishMicrobe

ответ

6

Асинхронный код просто запланирован на конец выполнения и синхронизация код продолжает выполняться без ожидания кода асинхронного. Метод, который вы передаете Future.then(...), выполняется, когда законченный асинхронный код завершен. Вы найдете много таких вопросов и примеров, помеченных [: dart-async:] здесь, в StackOverflow.

Если вы хотите код, который будет выполняться, когда код асинхронного завершения вам необходимо приковать его с then как вы сделали с другим кодом

var jerl = "asd"; 

HttpRequest.request('Foo', 
    method: "GET", 
    /* return */ requestHeaders: {"Authorization": "Secret"}) 
    .then((response) { 
    var jer1 = x.responseText; 
    print(jerl); 
    }); 

Вы можете использовать функцию async/await, чтобы сделать код более похожим код синхронизации

Future someMethod() async { // <== added `Future` and `async` 
    var jerl = "asd"; 

    var response = await HttpRequest.request('Foo', // <== added `await` 
    method: "GET", 
    requestHeaders: {"Authorization": "Secret"}).then((x) => 
    print(response.text); 
} 

async является заразной. Невозможно вернуться от выполнения async для выполнения синхронизации. Если ваш код вызывает какой-либо метод или функцию async, и вам нужен код дальше, чтобы дождаться результата async, вам необходимо связать весь следующий код (также в методах вызова) с .then (или использовать async/await). Для этого вам также понадобится return будущее для вызывающего абонента, чтобы он мог позвонить .then().

С async/await вам не нужно явно возвращать будущее.

async/await не делает асинхронный код синхронизации (как упоминался выше), это только делает его выглядеть больше как код синхронизации. Основополагающее поведение идентично тому, как с then.

+0

Действительно хорошая оценка! Спасибо! – BluishMicrobe