为了账号安全,请及时绑定邮箱和手机立即绑定

当我在对象字面量中使用 await 时程序如何运行?

当我在对象字面量中使用 await 时程序如何运行?

肥皂起泡泡 2023-03-10 16:45:02
当我写一个返回对象的函数,但是对象的每一个值都是通过 resolving promises 构造的,最后我会得到什么?我的意思是,对象值的类型是什么?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    }}谢谢你!
查看完整描述

2 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

要求您澄清您的问题(!)。我会尽力解释您实际要问的内容。我很想简单地删除这个答案。它可能有用也可能没有用!


如果你伪造“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",which);

   return new Promise( resolve =>  

      setTimeout( () => {

          console.log("resolving",which);

          resolve();

      }, Math.random() * 1000)

   );

}



foo();


至于你的对象会包含什么fetch方法的返回值是:

解析为Response对象的 Promise 。


查看完整回答
反对 回复 2023-03-10
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Promise 是创建 Promise 时不一定知道的值的代理。它允许您将处理程序与异步操作的最终成功值或失败原因相关联。这让异步方法像同步方法一样返回值:异步方法不是立即返回最终值,而是返回一个在未来某个时间点提供值的承诺。

p1 和 p2 在两个示例中都返回一个承诺。


查看完整回答
反对 回复 2023-03-10
  • 2 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信