javascript - retornar - ¿Cómo espero que termine una promesa antes de devolver la variable de una función?
pasar funcion como parametro javascript (5)
¿Qué debo hacer para que esta función espere el resultado de la promesa?
Use
async/await
await (NO forma parte de ECMA6, pero está disponible para Chrome, Edge, Firefox y Safari desde finales de 2017, consulte
canIuse
)
MDN
async function waitForPromise() {
// let result = await any Promise, like:
let result = await Promise.resolve(''this is a sample promise'');
}
Agregado debido al comentario: una función asíncrona siempre devuelve una Promesa, y en TypeScript se vería así:
async function waitForPromise(): Promise<string> {
// let result = await any Promise, like:
let result = await Promise.resolve(''this is a sample promise'');
}
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");
}
});
}
En lugar de devolver una
resultsArray
, devuelve una promesa de una matriz de resultados y luego 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 asíncrona.
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:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
return query.find({});
}
// later
resultsByName("Some Name").then(function(results){
// access results here by chaining to the returned promise
});
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 .
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:
query.find().then(function() {
console.log("success!");
}, function() {
console.log("error");
});
Ahora, para ejecutar cosas después de que se complete la promesa, puede ejecutarla dentro de la devolución de llamada de la promesa dentro de la llamada
then()
.
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í:
query.find().then(function() {
console.log("success!");
return new Parse.Query(Obj).get("sOmE_oBjEcT");
}, function() {
console.log("error");
}).then(function() {
console.log("success on second callback!");
}, function() {
console.log("error on second callback");
});
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.
var promise = query.find();
return promise;
//Or return query.find();
Tengo el mismo problema, así que mantengo algo de código, el código necesita llamar a ajax para procesar otra tarea, aquí mi código
this.bindChangeEvent = function () {
//select all bind change
this._select_all.bind(''change'', function () {
console.log(''All'')
if ($(this).is(":checked")) {
///todo: call ajax to get all ids
var idsAllItem = pointer.getAllData();
console.log(idsAllItem);
console.log(''Another todo'');
Función Ajax
this.getAllData = function() {
var promises = [];
var def = new $.Deferred();
return new Promise((resolve, reject) => {
// AJAX request
var url = ''...'';
$.ajax({
url: url,
type: "get",
async: true,
data: {},
dataType: "json",
success: function (data) {
console.log(''Ajjax done'');
resolve(data)
},
error: function (err) {
reject(err)
}
});
})
};
y obtengo resultado
Another todo
Output
Ajax Done
...