La raison pour laquelle il ne fonctionne pas sur la deuxième entrée de nom, vous appelez une fonction test()
, renvoyant le deferred object qui puis ajouter est la possibilité de vous appeler original test()
permettre l'accès aux méthodes de rappel comme .then()
, .fail()
et .done()
.
Cependant, si vous ne recevez pas l'entrée que vous wan't que vous appelez la fonction test()
à nouveau, ce qui crée une nouvelle deferred object. Ainsi, l'appel d'origine à test()
auquel vous avez ajouté le rappel done()
à ne recevra jamais le rappel.
Modifier à:
var d = $.Deferred();
function test()
{
var name=prompt("Please enter your name","Harry Potter");
if (name=="aa")
d.resolve();
else
setTimeout(test, 1000);
return d.promise();
}
test().done(function() { alert("It's Ok!"); });
Ce fut vous référencez la MÊMEdeferred object et non en créer un nouveau à chaque fois que la fonction test()
fonctionne.
voir travailler here
Il fonctionne très bien. http://www.jsfiddle.net/MQsbS/1/ assurez-vous que vous utilisez jQuery 1.5.0 au moins. – jAndy
oui, cela ne fonctionne que dans le cas où "aa" est entré pour la première fois .. – flienteen