我只是尝试使用异步等待问题语句的不同组合,所以我尝试了,
基本上,我有两个函数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))
就像上面的代码一样,如果我能够将.then()
应用于sum
,那是一个承诺吗?
当我做console.log(typeof sum)
时,它说sum
是function
而不是object
,那么异步函数到底是什么?我尝试搜索这种行为的答案,但找不到任何可以正确回答的来源。如果有人回答了这个问题或告诉我可以获取答案的在线资源或书籍,这对我有很大的帮助
我的节点版本为v10.15.3
谢谢
答案 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()
sum
(sum().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是上面的方式编写的原因。