Ainda estou lutando com promessas, mas fazendo algum progresso graças à comunidade daqui.
Eu tenho uma função JS simples que consulta um banco de dados Parse. Ele deve retornar a matriz de resultados, mas obviamente devido à natureza assíncrona da consulta (daí as promessas), a função retorna antes dos resultados, deixando-me com uma matriz indefinida.
O que preciso fazer para que essa função aguarde o resultado da promessa?
Aqui está o meu código:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
var promise = query.find({
success: function(results) {
// results is an array of Parse.Object.
console.log(results);
//resultsArray = results;
return results;
},
error: function(error) {
// error is an instance of Parse.Error.
console.log("Error");
}
});
}
javascript
parse-platform
promise
mac_55
fonte
fonte
Respostas:
Em vez de retornar um,
resultsArray
você retorna uma promessa para uma matriz de resultados e, em seguida,then
aquela no site da chamada - isso tem o benefício adicional de o chamador saber que a função está executando E / S assíncrona. A simultaneidade de codificação em JavaScript é baseada nisso - você pode ler esta pergunta para ter uma idéia mais ampla:Você pode ver mais exemplos de como usar promessas de análise com consultas na postagem do blog do Parse sobre isso .
fonte
Use
async/await
(NÃO faz parte do ECMA6, mas está disponível para Chrome, Edge, Firefox e Safari desde o final de 2017, consulte canIuse )MDN
Adicionado devido ao comentário: Uma função assíncrona sempre retorna uma promessa e, no TypeScript, seria semelhante a:
fonte
Você não deseja que a função aguarde, pois o JavaScript não deve ser bloqueado. Em vez disso, retorne a promessa no final da função, e a função de chamada poderá usar a promessa para obter a resposta do servidor.
fonte
success:
está desativado.return query.find();
.Você não está realmente usando promessas aqui. O Parse permite usar retornos de chamada ou promessas; sua escolha.
Para usar promessas, faça o seguinte:
Agora, para executar coisas após a conclusão da promessa, você pode executá-lo apenas dentro do retorno de chamada da promessa dentro do
then()
chamada. Até agora, isso seria exatamente o mesmo que retornos de chamada regulares.Realmente fazer bom uso das promessas é quando você as encadeia, assim:
fonte
Parse.Object
's.