Comportement par défaut si aucune autre fonction n'est enchaînée à une promesse

Je souhaite ouvrir un 'confirmer que vous souhaitez annuler la boîte de dialogue', et si aucune autre fonction n'est enchaînée, puis par défaut pour naviguer vers une page ( $window.history.back(); ).

C'est ainsi que je pourrais le faire si je passais en rappel:

 function openCancelModal(form, callback) { if (form.$dirty) { var message = '...'; modalThingy.open(message).then(callback || default); } function default() { $window.history.back(); } } 

Cependant, cela engloutit le pouvoir (fraîcheur) d'utiliser des promesses.

Existe-t-il un moyen de faire une promesse, mais si rien n'est enchaîné, appelez-vous une fonction par défaut?

J'utilise angularjs, mais j'imagine qu'il y a une réponse générique à ce problème.

Existe-t-il un moyen de faire une promesse, mais si rien n'est enchaîné, appelez-vous une fonction par défaut?

Au point où vous revenez la promesse de la fonction, l'appelant n'a même pas vu l'objet de promesse mais il n'a donc pas eu l'occasion de voir ce que l'appelant fera ou ne fera pas après la promesse est retourné afin que rien ne puisse être défini Up ou vu d'avance avant de rendre la promesse.

En outre, les objets prometteurs standard ne fournissent aucun moyen d'interroger ce que les gestionnaires sont ou ne sont pas attachés.


Il y a des choses difficiles qui pourraient être faites (même si je ne pense pas que je les recommanderais).

Par exemple, vous pouvez annuler .then() sur la promesse que vous .then() afin que vous puissiez voir si cela se fait appel avant que la promesse soit résolue et que vous puissiez suivre ces informations dans votre propre état. Ensuite, lorsque la promesse est résolue, si .then() n'a pas encore été appelé, vous pouvez exécuter votre comportement par défaut.

Voici un aperçu de ce type de plan de piratage:

 function someAsync() { var foundThenHandler = false; var p = new Promise(function(resolve, reject) { // some code that eventually and asynchronously // calls resolve or reject // as long as the code here executes some time in the future // after the caller has seen the returned promise and had a chance to // add its own .then() handlers, then the code can check the // foundThenHandler variable to see if .then() was ever called on it // For example: setTimeout(function() { resolve(); if (!foundThenHandler) { // carry out some default action } }, 1000); }); var oldThen = p.then; p.then = function(resolveHandler, rejectHandler) { foundThenHandler = true; return oldThen.apply(p, arguments); } return p; } someAsync().then(function(val) { // async operation finished, default action will not be triggered }); // no .then() handler attached, default action will be triggered someAsync();