jQuery Отложенное разрешение () не работает - PullRequest
1 голос
/ 12 февраля 2011

Что я делаю не так?

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!"); });

1 Ответ

3 голосов
/ 13 февраля 2011

Причина, по которой он не работает при вводе второго имени, заключается в том, что вы вызываете функцию test(), возвращающую отложенный объект , который затем добавляет вам исходный вызов test() allowдоступ к методам обратного вызова, таким как .then(), .fail() и .done().

Однако, если вы не получаете ввод, вы не хотите, вы снова вызываете функцию test(), которая создает NEW отложенный объект .Таким образом, исходный вызов test(), к которому вы добавили обратный вызов done(), никогда не получит обратный вызов.

Измените его на:

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!"); });

Это вы ссылались на ЖЕ отложенный объект и не создавать новый каждый раз, когда запускается функция test().

Видеть, как он работает здесь

...