2013-03-08 61 views
1

我有下面的示例代码使用jQuery推迟。我似乎无法理解的是,虽然brushTeeth函数返回被拒绝的承诺,但为什么总是正在解析另一个延迟的collectionResults。jQuery延迟不被拒绝

一些jQuery延期阅读说,如果在$ .when中传递的函数不是承诺,它们将立即解决,但brushTeeth实际返回一个承诺。

线索我在做什么错在这里?

ShowerModule = (function($) { 
        function init(){ 
         var result = $.Deferred(); 
         var collectionResults = $.when(brushTeeth); 
         collectionResults.done(function(){ 
          console.log("done"); 
         }) 

         collectionResults.fail(function(){ 
          console.log("reject"); 
         }) 

        } 

        function brushTeeth() { 
         var result = $.Deferred(); 
         result.reject('["bah"]'); 
         return result.promise(); 

        } 

        return { 
         init : init 
        } 

       }(jQuery)); 
      ShowerModule.init(); 

回答

1

想通了上述

var collectionResults = $.when(brushTeeth); 

线应该是

var collectionResults = $.when(brushTeeth()); 
+0

是的,除非这是一个更广泛的东西的简化,那么'.when()'是不必要的。 'brushTeeth()。done(function(){...})。fail(function(){...});'会产生同样的效果。使用'.when()'来响应多个promise的组合分辨率。 – 2013-03-09 01:17:44

+1

是的,这是一个简单的例子。我使用.when()的情况下,需要解决2个或更多的承诺:) – Dhana 2013-03-12 19:42:22

0

创建了两个递延对象与samename result

所以我想$。当正在它上面的一个作为承诺..是一个不拒绝.. 试试这个

function init(){ 
        // var result = $.Deferred(); remove this 
        var collectionResults = $.when(brushTeeth()); //accept function and not the function's reference 
        collectionResults.done(function(){ 
         console.log("done"); 
        }) 

        collectionResults.fail(function(){ 
         console.log("reject"); 
        }) 

       } 
+0

但是,每个这些结果变量将是它所包含的函数的本地。反正,我在这里编辑了代码,但结果仍然相同http://jsbin.com/oyemez/1/编辑 – Dhana 2013-03-08 06:21:24

+0

好的..你的代码给你完成..因为你传递的是函数的引用而不是函数本身...这里是jsbin http://jsbin.com/oyemez/6/edit ....试试这个'$ .when(brushTeeth());' – bipen 2013-03-08 06:35:23

+0

你已经解决了它很酷.. :) :) – bipen 2013-03-08 06:35:47