Buenas noticias. Desde ayer puedes cancelar tu promesa.
Publiqué la nueva versión de mi pequeño complemento jquery-timing que proporciona dos métodos entre muchos otros llamados .wait() y .unwait().
var deferred = $("#box").delay(2000).show("slow").delay(2000).promise();
$.wait(deferred, function(){ log("Done"); });
Si a continuación desea anular el registro de la devolución de llamada:
$.unwait();
Estas versiones estáticas de espera y unwait también el apoyo de un nombre de grupo opcional a no cancelar cualquier manejador pero sólo un conjunto específico.
Además de que se puede hacer muchas cosas más inteligente como:
$('#box').wait(deferred).addClass('ready');
o todo el código en una cadena, sin opción unwait:
$("#box").delay(2000).show("slow")
.delay(2000).join(function(){log("Done");})).addClass('ready');
o el mismo aún más corto con la opción de cancelar las dos pausas:
$("#box").wait(2000).show("slow",$)
.wait(2000, function(){log("Done");})).addClass('ready');
Sólo hay que ver los documentos, ejemplos, y la API de lo que se ajusta mejor para usted.
Si solo tiene el objeto promesa (y no tiene acceso al original diferido), entonces sería imposible hacerlo. La idea de una promesa es poder escuchar lo diferido que se resuelve o rechaza, sin la funcionalidad de resolución/rechazo. Lo que puede hacer es crear un envoltorio de promesa que exponga los funcionamientos de promesa originales, pero todas las devoluciones de llamada están enlazadas con una función de envoltura que escucha algún tipo de señal para evitar activar la devolución de llamada si el diferido se marca como cancelado. –
casi, en realidad solo desea crear un rechazo diferido y manualmente o resolverlo como mejor le parezca. –