异步函数是真正的函数还是Promise对象?

时间:2019-04-27 08:33:27

标签: javascript async-await

我只是尝试使用异步等待问题语句的不同组合,所以我尝试了,
基本上,我有两个函数promise1()promise2(),它们分别返回两个promise,分别在3秒和1秒后解析值10和20。以下是我编写的代码

function promise1()
{
        return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                        resolve(10)
                },3000)
        })
}

function promise2()
{
        return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                        resolve(20)
                },1000)
        })
}

async function sum()
{
        let num1 = await promise1();
        let num2 = await promise2();

        return num1+num2;
}
sum().then(s => console.log(s))
当我执行此代码时,我得到30作为答案

就像上面的代码一样,如果我能够将.then()应用于sum,那是一个承诺吗?
当我做console.log(typeof sum)时,它说sumfunction而不是object,那么异步函数到底是什么?我尝试搜索这种行为的答案,但找不到任何可以正确回答的来源。如果有人回答了这个问题或告诉我可以获取答案的在线资源或书籍,这对我有很大的帮助
我的节点版本为v10.15.3

谢谢

2 个答案:

答案 0 :(得分:3)

它们是返回值始终是诺言的函数。

async function foo() { }

const value = foo();

console.log(foo instanceof Function);
console.log(foo instanceof Promise);
console.log(value instanceof Function);
console.log(value instanceof Promise);


  

就像上面的代码一样,如果我能够应用.then()求和,那是一个承诺吗?

不,你不是。

sum.then()不起作用。 sum().then()将。添加()将调用一个函数并为您提供返回值。

答案 1 :(得分:2)

  

异步函数真的起作用还是Promise对象?

它们实际上是功能。函数 return promises。

  

就像上面的代码一样,如果我能够将.then()应用于sum,那是一个承诺吗?

您没有。您在调用结果上使用了.then() sumsum().then(...),而不是sum.then(...))。就像调用返回字符串的函数,然后对函数返回的内容使用toUpperCase

这两个函数本质上是等效的,其中包含一些次要细节:

// #1
function foo() {
    return new Promise((resolve, reject) => {
        try {
            getSomePromise()
            .then(result => result * 2)
            .catch(reject);
        } catch (error) {
            reject(error);
        }
    });
}

// #2
async function foo() {
    const result = await getSomePromise();
    return result * 2;
}

自然地,这不是现实生活中写#1的方式,它是promise creation antipattern的一个例子,但这是对async函数的内在外观的合理解释。纯粹为了完整性,您可能会这样写#1:

// #3
function foo() {
    return getSomePromise().then(result => result * 2);
}

区别在于,如果getSomePromise抛出错误而不是运行并返回承诺,则该函数(#3)将(同步)抛出错误,而上面的#1将返回拒绝的诺言。 async函数可以做到这一点,这就是为什么#1是上面的方式编写的原因。