2014-09-04 91 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