He estado viendo código que se parece a:
myObj.doSome("task").then(function(env) {
// logic
});
De donde then()
viene
javascript
Kay pálido
fuente
fuente
Respuestas:
La forma tradicional de lidiar con llamadas asincrónicas en JavaScript ha sido con devoluciones de llamada. Digamos que tuvimos que hacer tres llamadas al servidor, una tras otra, para configurar nuestra aplicación. Con las devoluciones de llamada, el código podría tener un aspecto similar al siguiente (suponiendo una función xhrGET para hacer que el servidor llame):
En este ejemplo, primero buscamos la configuración del servidor. Luego, en base a eso, buscamos información sobre el usuario actual y luego finalmente obtenemos la lista de elementos para el usuario actual. Cada llamada xhrGET toma una función de devolución de llamada que se ejecuta cuando el servidor responde.
Ahora, por supuesto, cuantos más niveles de anidamiento tengamos, más difícil será leer, depurar, mantener, actualizar y básicamente trabajar con el código. Esto se conoce generalmente como infierno de devolución de llamada. Además, si necesitáramos manejar errores, posiblemente debamos pasar otra función a cada llamada xhrGET para decirle qué debe hacer en caso de un error. Si quisiéramos tener un solo controlador de errores común, eso no es posible.
Promise API propone lo siguiente:
promise
objeto.promise
objeto tendrá unathen
función que puede tomar dos argumentos, unsuccess
controlador y unerror
controlador.then
función se llamará solo una vez , una vez que finalice la tarea asincrónica.then
función también devolverá apromise
, para permitir encadenar múltiples llamadas.value
, que se pasará a la siguiente función como unargument
, en la cadena depromise
s.promise
(realiza otra solicitud asincrónica), entonces se llamará al siguiente controlador (éxito o error) solo después de que finalice la solicitud.Entonces, el código de ejemplo anterior podría traducirse a algo como lo siguiente, usando promesas y el
$http
servicio (en AngularJs):Propagación de éxito y error
El encadenamiento de promesas es una técnica muy poderosa que nos permite lograr muchas funciones, como hacer que un servicio realice una llamada al servidor, realice un procesamiento posterior de los datos y luego devuelva los datos procesados al controlador. Pero cuando trabajamos con
promise
cadenas, hay algunas cosas que debemos tener en cuenta.Considere la siguiente
promise
cadena hipotética con tres promesas, P1, P2 y P3. Cada unopromise
tiene un controlador de éxito y un controlador de errores, por lo que S1 y E1 para P1, S2 y E2 para P2, y S3 y E3 para P3:En el flujo normal de cosas, donde no hay errores, la aplicación fluiría a través de S1, S2 y, finalmente, S3. Pero en la vida real, las cosas nunca son tan suaves. P1 podría encontrar un error, o P2 podría encontrar un error, disparando E1 o E2.
Considere los siguientes casos:
• Recibimos una respuesta exitosa del servidor en P1, pero los datos devueltos no son correctos o no hay datos disponibles en el servidor (piense en una matriz vacía). En tal caso, para la próxima promesa P2, debería activar el controlador de errores E2.
• Recibimos un error para la promesa P2, disparando E2. Pero dentro del controlador, tenemos datos del caché, lo que garantiza que la aplicación se pueda cargar normalmente. En ese caso, podríamos asegurarnos de que después de E2, se llame a S3.
Entonces, cada vez que escribimos un manejador de éxito o error, debemos hacer una llamada, dada nuestra función actual, ¿es esta promesa un éxito o un fracaso para el próximo manejador en la cadena de la promesa?
Si queremos activar el controlador de éxito para la próxima promesa en la cadena, podemos devolver un valor del controlador de éxito o error
Si, por otro lado, queremos activar el controlador de errores para la próxima promesa en la cadena, podemos hacerlo usando un
deferred
objeto y llamando a sureject()
métodoObjetos diferidos en Jquery: https://api.jquery.com/jquery.deferred/
Objetos diferidos en AngularJs: https://docs.angularjs.org/api/ng/service/ $ q
fuente
La función then () está relacionada con las "promesas Javascript" que se usan en algunas bibliotecas o frameworks como jQuery o AngularJS.
Una promesa es un patrón para manejar operaciones asincrónicas. La promesa le permite llamar a un método llamado "entonces" que le permite especificar las funciones que se utilizarán como devoluciones de llamada.
Para obtener más información, consulte: http://wildermuth.com/2013/8/3/JavaScript_Promises
Y para las promesas angulares: http://liamkaufman.com/blog/2013/09/09/using-angularjs-promises/
fuente
A promise can only succeed or fail once
yIf a promise has succeeded or failed and you later add a success/failure callback, the correct callback will be called
promise
y qué se puede hacer concallback
Que yo sepa, no hay un
then()
método incorporado enjavascript
(en el momento de escribir este artículo).Parece que lo que sea que
doSome("task")
está regresando tiene un método llamadothen
.Si registra el resultado devuelto
doSome()
en la consola, debería poder ver las propiedades de lo que se devolvió.ACTUALIZACIÓN (a partir de ECMAScript6) : -
La
.then()
función se ha incluido en javascript puro.De la documentación de Mozilla aquí ,
El objeto Promesa, a su vez, se define como
Es decir,
Promise
actúa como un marcador de posición para un valor que aún no se calcula, pero se resolverá en el futuro. Y la.then()
función se usa para asociar las funciones que se invocarán en la Promesa cuando se resuelva, ya sea como un éxito o un fracaso.fuente
.then
ese momento, pero las promesas nativas están llegando ahora en ES6: html5rocks.com/en/tutorials/es6/promisesAquí hay una cosa que hice para aclarar cómo funcionan las cosas. Supongo que otros también pueden encontrar útil este ejemplo concreto:
fuente
Aquí hay un pequeño JS_Fiddle.
luego es una pila de devolución de llamada de método que está disponible después de que se resuelve una promesa, es parte de una biblioteca como jQuery pero ahora está disponible en JavaScript nativo y a continuación se muestra la explicación detallada de cómo funciona
Puede hacer una Promesa en JavaScript nativo: al igual que hay promesas en jQuery, cada promesa se puede apilar y luego se puede invocar con devoluciones de llamada Resolver y Rechazar. Así es como se pueden encadenar llamadas asincrónicas.
Bifurqué y edité de MSDN Docs sobre el estado de carga de la batería.
Lo que esto hace es tratar de averiguar si la computadora portátil o dispositivo del usuario está cargando la batería. luego se llama y puede hacer su trabajo después del éxito.
Otro ejemplo de es6
fuente
then
viene y cómo funciona. Debería mejorar su respuesta para proporcionar esos detalles.Sospecho que doSome devuelve esto, que es myObj, que también tiene un método then. Método estándar de encadenamiento ...
si doSome no devuelve esto, siendo el objeto en el que se ejecutó doSome, puede estar seguro de que devuelve algún objeto con un método then ...
como señala @patrick, no hay entonces () para js estándar
fuente
doSome ("tarea") debe devolver un objeto de promesa, y esa promesa siempre tiene una función de continuación. Por lo tanto, su código es así
y sabes que esto es solo una llamada ordinaria a la función miembro.
fuente
.then
devuelve una promesa en la función asíncrona.Un buen ejemplo sería:
Para agregarle otra lógica, también puede agregar la
reject('I am the rejected param')
llamada a la función y console.log.fuente
En este caso
then()
es un método de clase del objeto devuelto pordoSome()
método.fuente
La función ".then ()" se usa ampliamente para objetos prometidos en la programación de Asynchoronus para aplicaciones de la Tienda Windows 8. Según tengo entendido, funciona de alguna manera como una devolución de llamada.
Encuentre detalles en este Documentantion http://msdn.microsoft.com/en-us/library/windows/apps/hh700330.aspx
Causa también podría ser el nombre de cualquier otra función definida.
fuente
Otro ejemplo:
La misma lógica usando las funciones de flecha abreviada:
fuente
Llego unos 8 años tarde, bueno ... de todos modos, realmente no sé qué hace entonces () pero quizás MDN podría tener una respuesta. En realidad, podría entenderlo un poco más.
Esto le mostrará toda la información (con suerte) que necesita. A menos que alguien ya haya publicado este enlace. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
El formato es promise.prototype.then () La promesa y el prototipo son como variables similares pero no como variables en javascript, quiero decir que otras cosas van allí como navigator.getBattery (). Luego () donde esta realmente existe pero es Apenas utilizado en la web, este muestra estados sobre la batería del dispositivo, más información y más sobre MDN si tiene curiosidad.
fuente