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.