2011-02-12 2 views
1

Qu'est-ce que je fais mal?jQuery Résolution différée() ne fonctionne pas

function test() 
{ 
    var d = $.Deferred(); 
    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!"); }); 
+0

Il fonctionne très bien. http://www.jsfiddle.net/MQsbS/1/ assurez-vous que vous utilisez jQuery 1.5.0 au moins. – jAndy

+0

oui, cela ne fonctionne que dans le cas où "aa" est entré pour la première fois .. – flienteen

Répondre

3

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

+0

merci, j'ai oublié à ce sujet. – flienteen

+0

Pas de problème du tout. – Scoobler