Поведение асинхронной функции - PullRequest
0 голосов
/ 15 ноября 2018

Если я правильно понимаю обещания, не следует ли поменять следующий вывод.

async function funcA() {
  console.log("executing funcA");
  await new Promise(function() {
    console.log("inside new promise")
  });
}

function funcB() {
  console.log("executing funcB");
}

funcA();
funcB();

//Outputs the following
"executing funcA"
"inside new promise"
"executing funcB"

Чем это отличается от синхронного выполнения funcA

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Нет, async + await - это просто синтаксический сахар для цепочки обещаний, поэтому, если вы ничего не делаете await, вы все равно выполняете синхронно.


Например, возьмите функцию:

async function foo() {
    const users = await database.users.list();
    const pets = await database.pets.findFor(users);
    console.log("These are the application's users: ", users);
    console.log("And all their pets: ", pets);
}

Он скомпилирован в основном так:

function foo() {
    return new Promise(function(resolve, reject) {
        try {
            var users;
            var pets;
            database.users.list()
                .then(function (us) {
                    users = us;
                    return database.pets.findFor(users);
                })
                .then(function (ps) {
                    pets = ps;
                    console.log("These are the application's users: ", users);
                    console.log("And all their pets: ", pets);
                })
                .then(resolve, reject);
        } catch (error) {
            reject(error);
        }
    });
}

И если вы посмотрите на документацию для конструктора Promise , вы увидите, что исполнитель (функция, которую вы ему даете) выполняется немедленно (то есть синхронно).


Итак, вернемся к вашему примеру, ваша «асинхронная» функция будет реализована так, как показано ниже:

function funcA() {
    return new Promise(function (resolve, reject) {
        try {
            console.log("executing funcA");
        } catch (error) {
            reject(error);
        }
    });
}

Итак, console.log будет выполняться синхронно.

0 голосов
/ 15 ноября 2018

В funcA нет приостановки выполнения, тогда funcA будет выполняться синхронно.

Асинхронная функция может содержать выражение await, которое приостанавливает выполнение асинхронной функции и ожидаетпрошло разрешение Promise, а затем возобновляет выполнение асинхронной функции и возвращает разрешенное значение.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function#Description

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