jQuery Deferred resolve()不起作用

时间:2011-02-12 19:59:17

标签: jquery jquery-deferred

我做错了什么?

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 个答案:

答案 0 :(得分:3)

它对第二个名称输入无效的原因是,您正在调用函数test(),返回deferred object,然后添加原始调用test()的功能允许访问.then().fail().done()等回调方法。

但是,如果您没有收到输入,则不会再次调用函数test(),这会创建 NEW deferred object。因此,您添加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!"); });

这是您引用 SAME deferred object而不是每次运行test()函数时都不创建新的。{/ p>

查看工作 here