1

私が間違っているのは何ですか?

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

1 に答える 1

4

2 番目の名前の入力で機能しない理由は、関数 を呼び出して遅延オブジェクトtest()を返し、元の呼び出しに、 、などのコールバック メソッドへのアクセスを許可する機能を追加するためです。test().then().fail().done()

ただし、必要のない入力が得られない場合は、関数test()を再度呼び出すことになり、新しい 遅延オブジェクトが作成されます。したがって、コールバックを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()です。

ここで動作するのを見てください

于 2011-02-12T21:13:25.187 に答える