Tengo dos promesas, que son ambas matrices devueltas

let promise1 = Promise.resolve(['one', 'two']);
let promise2 = Promise.resolve(['three', 'four']);

Entonces quiero esperar que estas dos promesas juntas sean iguales a una matriz así:

expect(promise1.concat(promise2)).toEqual(['one', 'two', 'three', 'four']);

El código anterior está simplificado, y sé que podría hacer 2 declaraciones de espera, pero los valores pueden cambiar entre estar en la promesa 1 o la promesa 2.

He estado jugando con los bloques en vano ... ¿Cómo puedo lograr la declaración de esperar anterior? No tiene que ser concat, solo quiero combinar estas 2 matrices de promesas en 1.

0
DeejC 2 mar. 2018 a las 14:04

3 respuestas

La mejor respuesta

Simplemente use Promise.all para combine sus promesas y luego acumule su resultado en una sola matriz usando reduce():

const promise1 = Promise.resolve([1,2])
const promise2 = Promise.resolve([3,4])

Promise.all([promise1, promise2]).then(result => {
  const combined = result.reduce((acc, result) => { 
     return acc.concat(result)
  }, [])
  
  console.log(combined)
})

Esto le permite combinar un número arbitrario de matrices.

1
Nik Kyriakides 2 mar. 2018 a las 11:12

Basado en "cómo funciona el trabajo de espera" en GitHub, intente:

expect(
    Promise.all( promise1, promise2)
    .then(
         results=>results.reduce( (acc, result) => acc.concat( result), [])
    )
).toEqual(['one', 'two', 'three', 'four']);

Promise.all cumple con una serie de resultados de promesas individuales. La cláusula then concatena cada matriz de resultados en una matriz de acumulador combinada (usando reduce como en la respuesta @NicholasKyriakides). expect debería procesar la promesa final, devuelta por .then, como se describe en el enlace:

expect(promise).toEqual('foo');

... esencialmente será reemplazado por:

promise.then(function(value) {
     expect(value).toEqual('foo');
}
0
traktor53 2 mar. 2018 a las 22:22

¡No estoy muy seguro de lo que buscas porque básicamente ya lo has escrito!

const promise1 = Promise.resolve(['one', 'two']);
const promise2 = Promise.resolve(['three', 'four']);

Promise.all([promise1, promise2]).then(([result1, result2]) =>
   console.log(result1.concat(result2))
);

Sin embargo, si necesita eliminar la matriz, hay varias formas de no saber si eso es lo que necesita.

0
Dominic 2 mar. 2018 a las 11:12