¿Habría alguna diferencia si tengo:

async function test () {
  const foo = await bar()
  return Promise.all([promise1, promise2])
}

En lugar de:

async function test () {
  const foo = await bar()
  const [result1, result2] = await Promise.all([promise1, promise2])
  // Given that I don't care about result1, result2 in this `test` function
  return [result1, result2]
}

Obtengo el mismo resultado si lo hago. P.ej. Puedo hacer esto para cualquier caso:

test().then(([result1, result2]) => { ... })

Pero tengo más curiosidad sobre el mecanismo subyacente de cómo ambos se comportan igual.

En otras palabras, ¿cómo lo maneja la función asíncrona si dentro de la función devuelvo una promesa en lugar de un valor?

13
BPm 13 ene. 2017 a las 18:54

3 respuestas

La mejor respuesta

Creo que efectivamente está llamando a funciones sincrónicas con await dentro de la cadena de promesa que, de acuerdo con esto, responde :

Usted es perfectamente libre de llamar a funciones síncronas dentro de la cadena de promesa (desde dentro de los manejadores .then ()) o funciones asíncronas que luego devuelven una nueva promesa.

Cuando devuelve algo de un controlador .then (), puede devolver un valor (que se convierte en el valor resuelto de la promesa principal) o puede devolver otra promesa (que se encadena a la promesa anterior) o puede arrojar el que funciona como devolver una promesa rechazada (la cadena de la promesa se rechaza).

2
Scott Weaver 30 jul. 2019 a las 18:58

Ambas funciones devuelven un Promise.

const [result1, result2] = await Promise.all([promise1, promise2])
//HERE
return [result1, result2]

Donde escribí AQUÍ puede acceder a result1 y result2 var que son los resultados de las promesas.

Esperar es una alternativa para llamar a then en Promise y su forma también es más legible que

Promise.all([promise1, promise2]).then(function(results){

});

Si tiene varias solicitudes secuenciales, el uso de esperar es una mejor opción

var response1= await promise1   
var response2=await promise2

En contra

promise1.then(function(){
    promise2.then(function(){
       promise3.then(function(){
       })
    })
})

EDITAR

En la primera función, la palabra clave asíncrona es inútil, la prueba de función devolverá una Promesa

La segunda función devolverá una Promesa donde verá que la palabra clave aguarda. Cuando la promesa esperada se resuelva, la ejecución dentro de la función continuará y podrá acceder al resultado de la promesa

EDITAR 1

Tal vez entiendo lo que quiere decir, la palabra clave asíncrona encapsula su valor de retorno en una promesa que tiene como valor resuelto lo que ha devuelto

0
Marco Moretti 13 ene. 2017 a las 17:15

Creo que la forma en que funcionan las funciones asíncronas con respecto al valor de retorno es que verifica si ese valor está envuelto en un objeto Promise, y si no, lo hace automáticamente. Si devuelve explícitamente una Promesa, la función no hace nada con ella. Probé esto devolviendo una nueva promesa dentro de una función asíncrona:

async function test(){
var duration = resolveAfter(500)
    return new Promise((resolve, reject) =>{})
}

var neverresolved = test()

El resultado nunca se resuelve contiene una promesa que siempre está en estado pendiente, como se esperaba.

1
coco puffs 29 mar. 2017 a las 02:24