promises for finish calls await async javascript asynchronous callback

calls - javascript wait for function to finish



Elegantemente pasando un "evento de clic" a travĂ©s de mĂșltiples devoluciones de llamada (2)

Cuando un usuario no conectado hace clic en un botón determinado, quiero detener el evento, recopilar su oauth, recopilar su correo electrónico si no lo tengo y luego ejecutar el evento.

Quiero hacer todo en javascript porque eso mantendría las cosas mucho más simples.

Así es como lo estoy ejecutando, y tengo 2 preguntas:

  1. ¿Hay una manera más elegante de hacer devoluciones de llamada de múltiples niveles?
  2. La forma en que estoy desencadenando el evento al final parece hackish. ¿Cuál podría ser una mejor manera de hacerlo?

jQuery("a.callbacktesting").click(function(event){ if (success==false){ event.preventDefault(); event.stopImmediatePropagation(); authentication({endevent:event,followup:afterEmail},collectEmail, failFn); } }); //1st level function function authentication(params, successFn, failFn){ if (success=true){ successFn(params,params.followup,failFn); }else{ failFn(); } } //2nd level function function collectEmail(params, successFn, failFn){ console.log("Collecting email"); if (success=true){ successFn(params); }else{ failFn(); }; } //After everything is done, you want to execute this function afterEmail(params){ jele=$(params.endevent.currentTarget) action=params.endevent.type jele.trigger(action); }


Considere almacenar su devolución de llamada por evento en una variable. Cuando el usuario hace clic en el botón, su JS primero verifica que esté autenticado. Si es así, ejecuta la devolución de llamada. Si no es así, pasa la devolución de llamada a la rutina de autenticación como argumento. Cuando la rutina de autenticación es exitosa, puede ejecutar la devolución de llamada.


¿Qué pasa con esto?

if (success = true) {

?

¿Se da cuenta de que está configurando la variable global "éxito" como verdadera, correcta? Si desea detectar si la variable "éxito" es verdadera, use esto:

if (success === true) {

Tenga en cuenta las 3 marcas iguales.

Al hacer una traducción estricta de tu código, obtuve este resultado:

//After everything is done, you want to execute this function afterEmail(event) { $(event.currentTarget).trigger(event.type); } //2nd level function function collectEmail(event) { console.log("Collecting email"); if (success === true){ afterEmail(event); } else { failFn(); } } //1st level function function authentication(event) { if (success === true) { collectEmail(event); } else { failFn(); } } jQuery("a.callbacktesting").click(function (event) { if (success === false) { event.preventDefault(); event.stopImmediatePropagation(); authentication(event); } });

Si intentas desencadenar eventos DOM, entonces necesitarás usar jQuery.trigger o similar. Necesitaré más información sobre su programa para ayudar más.