在对象文字中使用await时程序如何运行?

问题描述

当我编写一个返回对象的函数,但是该对象的每个值都是通过解析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。多次运行它可以确认这一点,因为对p1p2的调用不会交织。

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。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...