Нужно ли ждать void asyn c функции? - PullRequest
0 голосов
/ 31 марта 2020

Представьте себе следующее JavaScript:

async function f(x)
{
     var d = await NetworkRequest(x);
     d.ProcessResponse();
}

async function g()
{
    f(x);
    // Is network io completed now?

}

NetworkRequest - это действительно асинхронная c функция, которая выполняется асинхронно. Вопрос - к моменту возврата f () можно ли быть уверенным, что ProcessResponse выполнено?

Что, если g не объявлено как asyn c - будет ли это иметь значение?

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Вопрос - к моменту возврата f () можно ли быть уверенным, что ProcessResponse выполнен?

Абсолютно нет.

f объявлено async он возвращает обещание и передает управление обратно на g, как только переходит в режим сна, пока ожидает другое обещание.

То есть до того, как ProcessResponse даже будет вызван.

Что, если g не объявлено как asyn c - будет ли это иметь значение?

Нет


Это может быть продемонстрировано:

const obj = {
    ProcessResponse: () => console.log("Process Response")
};

function NetworkRequest() {
    return new Promise( res => setTimeout(() => res(obj), 1000) );
}



async function f(x)
{
     console.log("f, before await");
     var f = await NetworkRequest(x);
     console.log("f, after await");
     f.ProcessResponse();
     console.log("f, after Process Response");
}

async function g()
{
    console.log("g, before f");
    f(x);
    console.log("g, after f");
}

const x = "global";
g();
1 голос
/ 31 марта 2020

Asyn c функции кажутся блокирующими, но на самом деле это не так. Они возвращают обещание, которое разрешается до их возвращаемого значения, потому что они все еще выполняются асинхронно. Если вы ничего не вернете, он просто вернет обещание, которое ни к чему не приведет. В g вам все равно придется await f(x).

...