2016-01-06 37 views
0

返回$ .Deferred()遞歸函數我有一個返回$.Deferred();與setTimeout的

的功能如下遞歸函數:

var myTest = function (i, deferred) { 
    if (!deferred) { 
     deferred = $.Deferred(); 
    } 

    if (i < 3) { 
     i++; 
     console.log("Recursion (" + i + ")!"); 
     return myTest(i, deferred); 
    } else if (i === 3) { 
     console.log("Resolving!"); 
     return deferred.resolve("Woohoo, reached " + i + "!"); 
    } 
} 

/* Call it */ 
myTest(0).done(function (result) { 
    console.log(result); 
}); 

這使的預期輸出:

Recursion (1)! 
Recursion (2)! 
Recursion (3)! 
Resolving! 
Woohoo, reached 3! 

但是,如果我將line 8更改爲

setTimeout(function() { 
    return myTest(i, deferred); 
}, 500); 

失敗。我如何添加一個超時到我的函數,但達到相同的結果?

JsFiddle original code

JsFiddle with timeout

+0

你能解釋一下你想幹什麼?該邏輯似乎並沒有以任何方式使用延期。只是在最後一次迭代中返回一個強制解析延遲。 – Taplar

+0

它失敗,因爲該函數不會等待能夠返回的東西。什麼是更高層次的目標? – charlietfl

+0

@charlietfl現實世界的目標是等待選擇列表完成加載,以便在執行我的函數之前訪問它的值。我無法改變選擇填充的方式。我無法改變不幸的是如何填充。 – Alex

回答

0

如果我理解你想要什麼......

var myTest = function (i) { 
 
    var deferred = $.Deferred(); 
 
    
 
    var interval = setInterval(function(){ 
 
    if (i < 3) { 
 
     i++; 
 
     console.log("Iteration (" + i + ")!"); 
 
    } else { 
 
     console.log("Resolving!"); 
 
     deferred.resolve("Woohoo, reached " + i + "!"); 
 
     clearInterval(interval); 
 
    } 
 
    }, 1000); 
 
    
 
    return deferred; 
 
} 
 

 
/* Call it */ 
 
myTest(0).done(function (result) { 
 
    console.log(result); 
 
});