2016-01-06 12 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); 
 
});