异步功能行为

时间:2018-11-15 19:50:29

标签: javascript asynchronous es6-promise

如果我理解诺言正确,则不应反转以下输出。

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 :(得分:3)

不,async + await只是用于链接promise的语法糖,因此,如果您不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 constructor的文档,您会发现执行程序(您赋予它的功能)是立即(即同步)执行的。 / p>


因此,回到您的示例,您的“异步”功能将在幕后这样实现:

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

因此,console.log将被同步执行。

答案 1 :(得分:1)

funcA中没有等待会暂停执行,因此funcA将被同步执行。

  

异步函数可以包含一个await表达式,该表达式会暂停   执行异步功能并等待传递的Promise   解决,然后恢复异步函数的执行和   返回解析值。

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