问题描述
当我编写一个返回对象的函数,但是该对象的每个值都是通过解析promise构造的,最后我会得到什么?我的意思是,对象值的类型是什么?
async foo() {
return {
p1: await fetch('http://dummy.restapiexample.com/api/v1/employees') // FETCH REQUEST,p2: await fetch('http://dummy.restapiexample.com/api/v1/employees') // FETCH REQUEST
}
}
,对于这样的流程,p2
之后将解决p1
吗?此代码是否与以下示例相同:
async foo() {
const p1 = await fetch('http://dummy.restapiexample.com/api/v1/employees') // FETCH REQUEST
const p2 = await fetch('http://dummy.restapiexample.com/api/v1/employees') // FETCH REQUEST
return {
p1,p2
}
}
谢谢!
解决方法
谢谢您叫我澄清您的问题(!)。我会尽力解释您的实际要求。我很想简单地删除这个答案。它可能有用,也可能没有帮助!
如果您伪造了“ FETCH REQUEST”,则使用async
方法,该方法仅在启动时以及在(异步)解析之前就打印到控制台,您可以很清楚地看到它将完成p1
之前的p2
。多次运行它可以确认这一点,因为对p1
和p2
的调用不会交织。
async function foo() {
return {
p1: await randomAsyncMethod("p1"),p2: await randomAsyncMethod("p2")
}
}
async function randomAsyncMethod(which){
console.log("starting",which);
return new Promise( resolve =>
setTimeout( () => {
console.log("resolving",which);
resolve();
},Math.random() * 1000)
);
}
foo();
现在将其更改为第二个示例,您可以看到行为基本相同。
async function foo() {
var p1 = await randomAsyncMethod("p1");
var p2 = await randomAsyncMethod("p2");
return {
p1,p2
}
}
async function randomAsyncMethod(which){
console.log("starting",Math.random() * 1000)
);
}
foo();
关于对象将包含fetch
方法的返回值的内容是:
,解析为Response对象的承诺。
看着https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
在两个示例中,Promise是创建Promise时不一定知道的值的代理。它允许您将处理程序与异步操作的最终成功值或失败原因相关联。这样一来,异步方法就可以像同步方法一样返回值:与立即返回最终值不同,异步方法返回了在将来某个时刻提供值的承诺。
p1和p2返回一个Promise。