2014-09-04 71 views
0

我試圖用承諾在promise2得到得到承諾不工作

但是,如果我有一個在它的幾個元素對象的小部件

爲什麼我不能一直能讓我的console.log輸出

Parse.Cloud.define("extract", function(request, response) { 
    var user = request.params.user; 
    var promise = Parse.Promise.as(); 
    [...] 
    }).then(function() { 

     return query.find().then(function(results) { 
      _.each(results, function(result) { 
       [...] 


       Widget.objectId = result.id; 
       Widgets[timestamp] = Widget; 
      }); 
      return promise; 
     }).then(function(results) {  

      for (var key in Widgets) { 
       var Widget = Widgets[key]; 
       var widget_data = Widgets[key].widget_data; 
       var promise2 = Parse.Promise.as();  
       promise2 = promise2.then(function() {  
       return Parse.Cloud.run('extractWidgetData', { 
         'widget_data': widget_data, 
        }).then(function(newresult) { 
         Widgets[key].data = newresult.data; 

         console.log('--------WHY NOT HERE ALL TIME ?--------');        
        }); 
       }); 

       return promise2; 
      } 
     }).then(function() {     
      response.success(Widgets); 
      }, 
      function(error) { 
       response.error("Error: " + error.code + " " + error.message); 
      }); 
    }); 
}); 

我變得瘋狂的運行這個該死的編碼

編輯:我終於跟着流浪者的意見,以實現的東西,但我不知道這是否是串聯無極工作的好辦法...

Parse.Cloud.define("extract", function(request, response) { 
    var user = request.params.user; 
    var Widgets = {}; 
    ... 
    ... .then(function() { 
     return query.find().then(function(results) { 
      return Parse.Promise.when(results.map(function(result) { 
       var Widget = ...;//some transform of `result` 
       Widget.id = ...;//some transform of `result` 
       var timestamp = createdAtDate.getTime(); 
       ... 
       return Parse.Cloud.run('extractData', { 
        'widget_data': Widget.widget_data, 
       }).then(function(newresult) { 
        Widget.stat = newresult.stats; 
        return Widget;//<<<<<<< important! This ensures that results.map() returns an array of promises, each of which delivers a Widget objects. 
       });         
      })); 
    }).then(function() {    
     var promisedWidget = Array.prototype.slice.apply(arguments);  
     return Parse.Promise.when(promisedWidget.map(function(Widget) { 
      return Parse.Cloud.run('getWineStats', { 
       'id': Widget.data.id 
      }).then(function(stat) { 
       Widget.stat = stat; 
       return Widget; 
      });     
     })); 
    }).then(function() {    
     var promisedWidget = Array.prototype.slice.apply(arguments); 

     _.each(promisedWidget, function(Widget) {    
      var createdAtObject = Widget.createdAt;                                                                                                                                                                                                                                                     
      var strDate = createdAtObject.toString(); 
      var createdAtDate = new Date(strDate); 
      timestamp = createdAtDate.getTime(); 
      Widgets[timestamp] = Widget; 
     }); 

     return Widgets;    
    }).then(function(Widgets) {    
       response.success(Widgets); 
      }, 
      function(error) { 
       response.error("Error: " + error.code + " " + error.message); 
      }); 
    });    

}); 
+1

什麼是第一個'[...]'?它看起來像是通過省略一些代碼來搞砸縮進/匹配括號。請修復該問題,否則我們將無法幫助您處理您的代碼。 – Bergi 2014-09-04 17:51:59

+1

這個'promise'來自哪裏''return'在那個'query.find()。then()'callback?它解決了什麼問題?它是否與'var promise = Parse.Promise.as();'相同? – Bergi 2014-09-04 17:53:53

+0

你有什麼錯誤嗎?代碼在哪裏按預期執行? – Bergi 2014-09-04 17:55:38

回答

1

首先,我贊同壓痕/括號匹配BERGI的評論。

但是忽略了一會兒,在你有return query.find().then(...).then(...).then(...)代碼的核心,但從第一個.then()流到第二個是不正確的。除此之外,只有兩個.then()是必需的,因爲第一個代碼中的代碼是同步的,所以可以與第二個代碼合併。

刪除上面兩行for (var key in Widgets) {,然後至少Widgets將可用於進一步處理。

稍微進一步,您應該能夠在一個循環中完成所有需要的處理results。似乎很少有人在建立Widgets_.each(...),然後使用for (var key in Widgets) {...}遍歷結果對象。

在單個循環中,您可能需要Parse.Promise.when(results.map(...))模式,地圖的每一回合都會返回一個承諾的Widget。這樣,您就可以將所需數據傳遞給承諾鏈,而不是在外部範圍內構建一個Widgets對象。

做了這一切,你會落得這樣的:

Parse.Cloud.define("extract", function(request, response) { 
    var user = request.params.user; 
    ... 
    ... .then(function() { 
     return query.find().then(function(results) { 
      return Parse.Promise.when(results.map(function(result) { 
       var Widget = ...;//some transform of `result` 
       ... 
       return Parse.Cloud.run('extractWidgetData', { 
        'widget_data': Widget.widget_data, 
       }).then(function(newresult) { 
        Widget.data = newresult.data; 
        return Widget;//<<<<<<< important! This ensures that results.map() returns an array of promises, each of which delivers a Widget objects. 
       }); 
      })); 
     }).then(function() { 
      //Here, compose the required Widgets array from this function's arguments 
      var Widgets = Array.prototype.slice.apply(arguments);//Yay, we got Widgets 
      response.success(Widgets); 
     }, function(error) { 
      response.error("Error: " + error.code + " " + error.message); 
     }); 
    }); 
}); 
+0

非常感謝Roamer,我需要休息一下,但是一旦您的解決方案經過測試,會給您反饋並投票。 – Toucouleur 2014-09-04 19:46:53

+0

是的,還有一些工作要做,但一般模式應該是正確的。 – 2014-09-04 20:22:47