w3schools sincronas promises promesas funciones await asincronia anidadas and javascript node.js promise q

javascript - sincronas - promise js



¿Cómo esperar a que se resuelva una promesa? (3)

Estoy tratando con un marco NodeJs que requiere que cierta función sea sincrónica, pero necesito recuperar un valor al que solo se puede acceder de forma asíncrona. En un mundo perfecto, podría devolver una promesa, pero no puedo.

Como solución rápida y sucia, creé el siguiente método:

exports.synchronizePromise = function(promise) { var value; promise.then(function(promiseValue) { value = promiseValue; }); while (!value) {} // Wait for promise to resolve console.log("DONE: " + value); // Never reached return value; };

Pero me sale un error. ¿Hay alguna manera de lograr lo que necesito?


Dado que el nodo por defecto es de un solo hilo, no existe una manera fácil de resolverlo. Hay uno sin embargo. Bases en generadores / fibras puede agregar un tipo de ejecución simultánea al nodo. Hay una implementación de waitfor basada en eso.


En Q si tiene una promesa resuelta, puede tomar el valor con inspeccionar

exports.synchronizePromise = function(promise) { var i = promise.inspect(); if (i.state === "rejected") { throw i.reason; } else if (i.state === "fulfilled") { return i.value; } else { throw new Error("attempt to synchronize pending promise") } };

Sin embargo, si la promesa está pendiente, es realmente asíncrona y su pregunta no tiene sentido y la función arrojará un error.


Las promesas son asincrónicas. Representan un valor futuro, un valor disponible en 1 ms, o 1 minuto, o 1 día, o 1 año en el futuro, o nunca. Por definición, no hay forma de "forzarlos" a resolver, a excepción de una máquina del tiempo.

Si tiene una lógica ascendente que se basa en la premisa de la sincronicidad, pero por alguna razón las cosas de las que dependía ahora son asincrónicas, debe refactorizar ese componente ascendente para que funcione de forma asíncrona también. No hay otra alternativa.

Si su marco "requiere que una determinada función sea sincrónica" cuando esa función no es o no puede ser sincrónica, entonces el marco está mal diseñado e inutilizable, o al menos no se puede usar para su problema.