Como faço para uma promessa JavaScript retornar algo diferente de uma promessa?


38

Eu tenho uma especificação de um cliente para uma implementação de um método em um módulo:

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

Se houver uma variedade de gêneros,

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

Aqui está um método de esqueleto com uma promessa:

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

  return promise;
};

A promessa pode ser feita para retornar os dados encontrados nos gêneros? Existe uma maneira melhor de obter a descrição das especificações?


8
As promessas não "retornam" valores, elas as transmitem para um retorno de chamada (que você fornece com .then ()). A especificação simplesmente parece confusa para mim. Provavelmente, está tentando dizer que você deve fazer resolve([genre1, genre2, ...]);dentro da implementação da promessa.
— Ixrec

Respostas:


40

Parece que você não está entendendo como as promessas são usadas. Você retorna uma promessa. Depois, quando seu código resolver a promessa, ele será resolvido com um resultado e esse resultado será passado para o .then()manipulador anexado à promessa:

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
});

5
Isso confirma que as promessas funcionam da maneira que eu esperava.
— sealocal

Provavelmente, você não entende por que isso pode ser necessário. No ambiente, como React Native com Redux com Realm, eu tenho que colocar o estado inicial no Redux createStore. Deve ser buscado no Reino, mas retorna promessa. Eu só quero bloquear até que ele retorne dados, pois isso deve ser muito rápido e simples. Em vez disso, tenho problemas em como combinar promessas do Realm e o objeto JSON usual para createStore ()
— semelhante a

26

Versão atualizada usando em awaitvez de .then().

awaitpára de executar até que a promessa seja resolvida (ou seja, tenha um valor). Ao contrário do uso, .then()você pode apenas manter awaitos valores enquanto executa várias funções que retornam promessas, e a execução continua na próxima linha (isso é chamado de 'estilo direto). Também é muito melhor olhar, já que é consistente com o restante do JavaScript, do que em .then()qualquer lugar.

// 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()
})()

Aguardar é suportado em todos os navegadores e nós atuais


11
Oh, ei, uau, olha, 3 perguntas sobre esse assunto e finalmente temos uma resposta real!
— Andrew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.