He estado usando ES6 Promise.
Por lo general, una promesa se construye y se usa así
new Promise(function(resolve, reject){
if (someCondition){
resolve();
} else {
reject();
}
});
Pero he estado haciendo algo como a continuación para tomar la resolución afuera en aras de la flexibilidad.
var outsideResolve;
var outsideReject;
new Promise(function(resolve, reject) {
outsideResolve = resolve;
outsideReject = reject;
});
Y después
onClick = function(){
outsideResolve();
}
Esto funciona bien, pero ¿hay alguna manera más fácil de hacerlo? Si no, ¿es esta una buena práctica?
javascript
promise
es6-promise
Morio
fuente
fuente
Promise
debe ejecutarse sincrónicamente para permitir "exportar" las dos funciones.Respuestas:
No, no hay otra forma de hacer esto; lo único que puedo decir es que este caso de uso no es muy común. Como dijo Félix en el comentario, lo que hagas funcionará constantemente.
Vale la pena mencionar que la razón por la cual el constructor de promesas se comporta de esta manera es la seguridad de lanzamiento: si una excepción que no anticipó sucede mientras su código se ejecuta dentro del constructor de promesas, se convertirá en un rechazo, esta forma de seguridad de lanzamiento: la conversión de errores arrojados a Los rechazos son importantes y ayudan a mantener un código predecible.
Por esta razón de seguridad de lanzamiento, el constructor de la promesa se eligió entre los diferidos (que son una forma alternativa de construcción de la promesa que permite lo que está haciendo), en cuanto a las mejores prácticas, pasaría el elemento y usaría el constructor de la promesa en su lugar:
Por esta razón, siempre que pueda usar el constructor de promesas antes de exportar las funciones, le recomiendo que lo use. Siempre que pueda evitar ambos, evite ambos y la cadena.
Tenga en cuenta que nunca debe usar el constructor de promesas para cosas como
if(condition)
, el primer ejemplo podría escribirse como:fuente
Promise
cadena? Por ejemplo, en mi caso particular, estoy en un servidor, esperando una respuesta específica del cliente (un apretón de manos SYN-ACK para asegurarme de que el cliente se haya actualizado correctamente).sencillo:
fuente
promiseResolve()
. La semántica de una promesa es que siempre devuelve un valor. Además, esto es funcionalmente lo mismo que la publicación de OP, no entiendo qué problema está resolviendo de una manera reutilizable.promiseResolve()
no arrojará una excepción. Puede definir a.catch
en el constructor y no importa qué código lo llame, se llamará al constructor.catch
. Aquí está el jsbin que demuestra cómo funciona esto: jsbin.com/yicerewivo/edit?js,consoleUn poco tarde para la fiesta aquí, pero otra forma de hacerlo sería usar un objeto diferido . Básicamente, tiene la misma cantidad de repetitivo, pero es útil si desea pasarlos y posiblemente resolverlos fuera de su definición.
Implementación ingenua:
Versión ES5:
fuente
resolve|reject
se asignan léxicamente o por mediobind
. Esta es solo una implementación simple del objeto jQuery Deferred que ha existido desde 1.0 (ish). Funciona exactamente como una promesa, excepto que no hay seguridad de tiro. El punto central de esta pregunta era cómo guardar algunas líneas de código al crear promesas.Deferred
desuso?Una solución que se me ocurrió en 2015 para mi marco. Llamé a este tipo de promesas Tarea
fuente
Me gustó la respuesta de @JonJaques pero quería ir un paso más allá.
Si vincula
then
ycatch
luego elDeferred
objeto, entonces implementa completamente laPromise
API y puede tratarlo como una promesa yawait
eso y tal.fuente
Un método auxiliar aliviaría esta sobrecarga adicional y le daría la misma sensación de jQuery.
El uso sería
Que es similar a jQuery
Aunque, en un caso de uso, esta sintaxis nativa simple está bien
fuente
Estoy usando una función auxiliar para crear lo que llamo una "promesa plana":
Y lo estoy usando así ...
Ver ejemplo de trabajo completo:
Mostrar fragmento de código
Editar: he creado un paquete NPM llamado flat-promise y el código también está disponible en GitHub .
fuente
Puedes envolver la promesa en una clase.
fuente
Muchas de las respuestas aquí son similares al último ejemplo en este artículo . Estoy almacenando en caché varias promesas, y las funciones
resolve()
yreject()
se pueden asignar a cualquier variable o propiedad. Como resultado, puedo hacer que este código sea un poco más compacto:Aquí hay un ejemplo simplificado del uso de esta versión
defer()
para combinar unaFontFace
Promesa de carga con otro proceso asíncrono:Actualización: 2 alternativas en caso de que desee encapsular el objeto:
y
fuente
const result = await deferred.promise;
La respuesta aceptada es incorrecta. Es bastante fácil usar el alcance y las referencias, aunque puede enojar a los puristas de Promise :
Básicamente, estamos tomando la referencia a la función resolver cuando se crea la promesa, y la devolvemos para que se pueda establecer externamente.
En un segundo, la consola mostrará:
fuente
Sí tu puedes. Mediante el uso de la
CustomEvent
API para el entorno del navegador. Y utilizando un proyecto de emisor de eventos en entornos node.js. Dado que el fragmento en la pregunta es para el entorno del navegador, aquí hay un ejemplo de trabajo para el mismo.¡Espero que esta respuesta sea útil!
fuente
Nuestra solución fue utilizar cierres para almacenar las funciones de resolución / rechazo y, además, adjuntar una función para ampliar la promesa en sí.
Aquí está el patrón:
Y usándolo:
fuente
promise.resolve_ex = _resolve; promise.reject_ex = _reject;
... todavía funciona bien.También me encuentro perdiendo el patrón diferido en ciertos casos. Siempre puede crear uno encima de una promesa ES6:
fuente
Gracias a todos los que publicaron en este hilo. Creé un módulo que incluye el objeto Defer () descrito anteriormente, así como algunos otros objetos construidos sobre él. Todos aprovechan las promesas y la clara sintaxis de devolución de llamada de Promise para implementar el manejo de comunicación / eventos dentro de un programa.
Cola: Cola de ejecución basada en el encadenamiento de Promesa.
rp = require("repeatable-promise")
https://github.com/CABrouwers/repeatable-promise
fuente
Escribí una pequeña lib para esto. https://www.npmjs.com/package/@inf3rno/promise.exposed
He utilizado el enfoque método de fábrica otros escribieron, pero hizo caso omiso de la
then
,catch
,finally
métodos también, para que puedan resolver la promesa original de esos también.Resolviendo Promesa sin albacea desde afuera:
Competir con el setTimeout del ejecutor desde afuera:
Hay un modo sin conflicto si no desea contaminar el espacio de nombres global:
fuente
Hice una biblioteca llamada
manual-promise
que funciona como una caída en reemplazo dePromise
. Ninguna de las otras respuestas aquí funcionará como una caída en los reemplazosPromise
, ya que usan proxies o contenedores.yarn add manual-promise
npn install manual-promise
https://github.com/zpxp/manual-promise#readme
fuente
¿Qué tal crear una función para secuestrar el rechazo y devolverlo?
fuente
He reunido una esencia que hace ese trabajo: https://gist.github.com/thiagoh/c24310b562d50a14f3e7602a82b4ef13
así es como debe usarlo:
fuente
primero habilite --allow-natives-syntax en el navegador o nodo
fuente
Solo otra solución para resolver Promise desde el exterior
Uso
fuente