2014-01-23 68 views
2

我無法弄清楚如何執行子函數,並有一個延遲函數等待在返回之前調用它。DOJO Promise所有子功能

我已經採取了一個示例並對其進行了修改。它顯示了我想要做的事情。

基本上在下面的例子中,bingRequest調用只設置一個值的子。我希望BingRequest等到該子通話完成。在我的真實世界中,該值影響bingRequest函數返回的內容。我目前只是在bingRequest中插入了子代碼,但是如果我可以將子代碼拆分出來,它就會變得更加乾淨。如果我必須這樣做,我會但願能夠分解一些代碼。

感謝您的關注。

<!DOCTYPE html> 
<html > 
<head> 

    <link rel="stylesheet" href="../../_static/js/dojo/../dijit/themes/claro/claro.css"> 

    <script>dojoConfig = { async: true, parseOnLoad: false }</script> 
    <script src='//ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.js'></script> 

    <script> 
     require(["dojo/promise/all", "dojo/Deferred", "dojo/dom", "dojo/on", "dojo/json", "dojo/domReady!"], 
     function (all, Deferred, dom, on, JSON) { 
      var y = "none" 
      function googleRequest() { 
       var deferred = new Deferred(); 
       setTimeout(function() { 
        deferred.resolve("foo"); 
       }, 500); 
       return deferred.promise; 
      } 

      function bingRequest() { 
       var deferred = new Deferred(); 
       setTimeout(function() { 
        deferred.resolve("bar"); 
        sub(); 
       }, 750); 
       return deferred.promise; 
      } 
      function sub() { 

       setTimeout(function() { 
       y = "some"; 
       }, 750) 
      } 


      function baiduRequest() { 
       var deferred = new Deferred(); 
       setTimeout(function() { 
        deferred.resolve("baz"); 
       }, 1000); 
       return deferred.promise; 
      } 

      on(dom.byId("startButton"), "click", function() { 
       dom.byId("output").innerHTML = "Running..."; 
       all([googleRequest(), bingRequest(), baiduRequest()]).then(function (results) { 
        dom.byId("output").innerHTML = JSON.stringify(results)+y; 
       }); 
      }); 

     }); 
    </script> 
</head> 
<body class="claro"> 
    <h1>Output:</h1> 
<pre id="output"></pre> 
<button type="button" id="startButton">Start</button> 
</body> 
</html> 
+0

是這樣,你不希望通過真實後bingRequest()返回被fullfilled直到子() 「結束」,750毫秒的承諾? – goat

+0

是的,這是相關的。這只是一個例子,我試圖展示我在我的代碼中需要非公共系統的更復雜功能中所做的事情。 – Jim

回答

1

如果您正在等待sub,那麼您必須將代碼移至子函數。還必須forfill的諾言,我沒有看到,在你的代碼

 function sub() { 
      var deferred = new Deferred(); 
      setTimeout(function() { 
      y = "some"; 
      deferred.resolve(true); 
      }, 750) 
      return deferred.promise; 
     } 

而且你必須等待使用則響應調用函數.. 修正移動deffered.resolve(「巴」)到在那裏。

 function bingRequest() { 
      var deferred = new Deferred(); 
      setTimeout(function() { 
       sub().then(function(ret){ 
        //do what you want with y and return this promise 
        //ret will be the value you set in the resolve in this case true 
        deferred.resolve("bar"); 
       }); 
      }, 750); 
      return deferred.promise; 
     } 

小提琴:http://jsfiddle.net/theinnkeeper/pJXJ9/

+0

我將你的代碼添加到我的例子中,我似乎仍然沒有觸及子函數,並且代碼更改,直到更新innerHTML的then函數運行。 – Jim

+0

對不起,我離開了當時的解決方案(「酒吧」)。我糾正了它,並添加了一個小提琴來顯示。 – tik27