valor una retornar pasar parametro globales funciones funcion ejemplos ejemplo como closure javascript parse.com parse-platform promise

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

...