Ожидание завершения асинхронного - PullRequest
0 голосов
/ 07 мая 2018

У меня сейчас что-то вроде этого

   Future<bool>  checkAvailability(String email) async {
        var client = new http.Client();
        var response = await client.get(host);
        bool result;
        if (response.statusCode == 404) {
             result= true;
        }
        else if (response.statusCode == 200) {
              result= false;
        }
        client.close();
        return result;
    }

Я вызываю вышеуказанный метод из обычной не-aysnc-функции таким образом

void test() {
    checkAvailability(email).then((result){....}
       );
}

Проблема с приведенным выше кодом заключается в том, что он асинхронный. Из того, что я понимаю, что когда-то checkAvailability называется его запускается в другой теме? а пользовательский (основной) поток продолжается? Я прав?

Я хотел бы, чтобы функция test ожидала результата checkAvailability. Я знаю, что могу использовать await, но тогда метод test нужно будет пометить как async, и при вызове этого метода он будет запущен в другом потоке. Я хочу, чтобы звонок на checkAvailability был синхронным, и я не против дождаться ответа.

1 Ответ

0 голосов
/ 08 мая 2018

Когда вызывается checkAvailability, запускается ли он в другом потоке?

Асинхронное выполнение не связано с потоками, асинхронное работает с очередью событий https://webdev.dartlang.org/articles/performance/event-loop

test необходимо пометить как async, и при вызове этого метода он будет запущен в другом потоке.

Как упоминалось ранее, это не будет другой веткой. Использование async в методе test обычно работает нормально. Почему вы пытаетесь избежать этого?

Я хочу, чтобы вызов checkAvailability был синхронным, и я не против дождаться ответа.

Если вас не волнует результат, просто не ждите его, хотя это также приведет к тому, что вызывающий код будет продолжен до завершения checkAvailability.

Я хочу, чтобы вызов checkAvailability был синхронным, и я не против дождаться ответа.

Невозможно вернуться из асинхронного выполнения к синхронизации выполнения. Как только асинхронный вызов сделан, он завершается, и результат всегда будет Future и должен ожидаться или обрабатываться .then(...).

Если вас не волнует, когда checkAvailability завершится, и вам не нужен результат от асинхронных вызовов, которые он делает, тогда вам не нужно await или использовать then(...). Просто вызовите метод и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...