¿Cómo hago que una promesa de JavaScript devuelva algo más que una promesa?

38

Tengo una especificación de un cliente para la implementación de un método en un módulo:

 // getGenres():
 //  Returns a promise. When it resolves, it returns an array.

Si se le da una variedad de géneros,

['comedy', 'drama', 'action']

Aquí hay un método esqueleto con una promesa:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
  });

  return promise;
};

¿Se puede hacer la promesa de devolver los datos encontrados en los géneros? ¿Hay una mejor manera de lograr la descripción de la especificación?

sealocal
fuente
8
Las promesas no "devuelven" valores, los pasan a una devolución de llamada (que usted proporciona con .then ()). La especificación simplemente me suena confusa. Probablemente esté tratando de decir que se supone que debes hacer resolve([genre1, genre2, ...]);dentro de la implementación de la promesa.
Ixrec

Respuestas:

40

Parece que no estás entendiendo cómo se usan las promesas. Vuelves una promesa. Luego, cuando su código resuelve la promesa, la resuelve con un resultado y ese resultado se pasa al .then()controlador adjunto a la promesa:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
    resolve(result);
  });

  return promise;
};

MovieLibrary.getGenres().then(function(result) {
    // you can access the result from the promise here
});
jfriend00
fuente
55
Esto confirma que las promesas funcionan de la manera que esperaba.
sealocal
Probablemente, no entiendes por qué esto podría ser necesario. En el entorno, como React Native con Redux con Realm, tengo que poner el estado inicial en Redux createStore. Debería ser obtenido del Reino, pero devuelve la promesa. Solo quiero bloquear hasta que devuelva datos, ya que esto debería ser muy rápido y simple. En cambio, tengo problemas para combinar las promesas de Realm y el objeto JSON habitual para createStore ()
likern
26

Versión actualizada utilizando en awaitlugar de .then().

awaitdeja de ejecutarse hasta que la Promesa se haya resuelto (es decir, tenga un valor). A diferencia del uso .then(), puede mantener awaitlos valores a medida que ejecuta varias funciones que devuelven promesas, y la ejecución continúa en la siguiente línea (esto se llama 'estilo directo). También es mucho más agradable de ver, ya que es consistente con el resto de JavaScript, que en .then()todas partes.

// Example function that returns a Promise that will resolve after 2 seconds
var getGenres = function() {
  return new Promise(function(resolve) {
    setTimeout(function(){
      resolve(['comedy', 'drama', 'action'])
    }, 2000);
  });
}

// We start an 'async' function to use the 'await' keyword
(async function(){
  var result = await getGenres()
  console.log('Woo done!', result)

  // But the best part is, we can just keep awaiting different stuff, without ugly .then()s
  var somethingElse = await getSomethingElse()
  var moreThings = await getMoreThings()
})()

Await es compatible con todos los navegadores y nodos actuales

mikemaccana
fuente
1
Oh hey wow mira, 3 preguntas SE sobre este tema y finalmente tenemos una respuesta real!
Andrew