Todavía estoy luchando con las promesas, pero estoy progresando gracias a la comunidad aquí.
Tengo una función JS simple que consulta una base de datos Parse. Se supone que devuelve la matriz de resultados, pero obviamente debido a la naturaleza asincrónica de la consulta (de ahí las promesas), la función regresa antes que los resultados, dejándome con una matriz indefinida.
¿Qué debo hacer para que esta función espere el resultado de la promesa?
Aquí está mi 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
fuente
fuente
Respuestas:
En lugar de devolver un
resultsArray
, devuelve una promesa para una matriz de resultados y luegothen
eso en el sitio de la llamada: esto tiene el beneficio adicional de que la persona que llama sabe que la función está realizando E / S asincrónicas. La concurrencia de codificación en JavaScript se basa en eso: es posible que desee leer esta pregunta para tener una idea más amplia:Puede ver más ejemplos de uso de promesas de análisis con consultas en la propia publicación de blog de Parse al respecto .
fuente
Uso
async/await
(NO forma parte de ECMA6, pero está disponible para Chrome, Edge, Firefox y Safari desde finales de 2017, consulte canIuse )MDN
Agregado debido al comentario: una función asíncrona siempre devuelve una Promesa, y en TypeScript se vería así:
fuente
No desea hacer que la función espere, porque JavaScript está destinado a no ser bloqueante. En lugar de devolver la promesa al final de la función, la función de llamada puede usar la promesa para obtener la respuesta del servidor.
fuente
success:
bit está apagado.return query.find();
.En realidad no estás usando promesas aquí. Parse le permite usar devoluciones de llamada o promesas; tu elección.
Para usar promesas, haga lo siguiente:
Ahora, para ejecutar cosas después de que se complete la promesa, puede ejecutarla dentro de la devolución de llamada de la promesa
then()
llamada. Hasta ahora, esto sería exactamente lo mismo que las devoluciones de llamada regulares.Hacer un buen uso de las promesas es cuando las encadena, así:
fuente
Parse.Object
's.