2012-11-16 88 views
0

爲什麼在done()語句下的代碼在when()下調用的其他3函數之前執行?它立即開始。我想,當被用來排隊的功能和做的是使用時,當代碼是,好了,做執行的東西......在jquery done()之前執行的代碼when()

$(document).on('click', '.ajax', function() { 
    $.when(func1('<p>first</p>'), func2('<p>second</p>'), func3('<p>third</p>')).done(function() { 
     $('body').append('all done'); 
    }); 
}); 

function func1(first) { 

    var t = setTimeout(function() { 
     $('body').append(first); 
    }, 800); 
    return "success"; 

} 

function func2(second) { 

    var t = setTimeout(function() { 
     $('body').append(second); 
    }, 2700); 
    return "success"; 
} 

function func3(third) { 

    var t = setTimeout(function() { 
     $('body').append(third); 
    }, 200); 
    return "success"; 
}​ 

http://jsfiddle.net/loren_hibbard/NhAFN/

+3

你知道這些功能正在返回' 「成功」'幾乎instantaneiously吧? 'setTimeout'運行併發。 – thatidiotguy

+0

@thatidiotguy但如果我改變爲'return t;'或完全取消return語句,同樣的事情發生...... http://jsfiddle.net/loren_hibbard/NhAFN/1/ – 1252748

+0

正確。什麼是問題?我告訴你,你的代碼在返回之前並沒有等待「超時」數量。 – thatidiotguy

回答

5

您需要使用$ .Deferred()和回諾。

function func1(first) { 
    var dfd = $.Deferred(); 

    var t = setTimeout(function() { 
     $('body').append(first); 
     dfd.resolve(); 
    }, 800); 
    return dfd.promise(); 

} 

http://jsfiddle.net/NhAFN/2/

+0

首先,謝謝,這正是我所尋找的。如果我有一些命名的函數可以進行ajax調用,那麼我可以在不被'$ when()'調用的情況下中斷函數的情況下將延遲的promise添加到函數中嗎?如果這樣做有道理的話。 – 1252748

+0

您可以直接返回ajax函數調用的結果。 (函數填充下拉列表(d){返回$ .ajax({....成功:函數(){...}函數myAjax(){返回$ .ajax(...);}' –

+0

好吧。 }});'我會在哪裏放置'dfd.resolve();'和'dfd.promise();'對象?假設我只是把'var dfd = $ .Deferred();'放在函數的頂部。 – 1252748

相關問題