得到承诺不工作

时间:2014-09-04 17:04:40

标签: parse-platform promise

我正在尝试使用promise来获取promise2

但是如果我有一个包含多个元素的对象Widgets ......

为什么我无法获得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);
            });
    });
});

我疯狂地运行这个该死的代码

编辑:我终于按照Roamer的建议实施了一些事情,但我不确定这是否是与Promise系列合作的好方法......

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 个答案:

答案 0 :(得分:1)

首先,我回应Bergi关于缩进/匹配括号的评论。

但是暂时忽略了这一点,代码的核心是return query.find().then(...).then(...).then(...)但是从第一个.then()到第二个{0}的流程是不正确的。除此之外,只需要两个.then()s,因为第一个中的代码是同步的,所以可以与第二个合并。

删除for (var key in Widgets) {上方的两行,然后至少Widgets可以进一步处理。

稍微进一步,您应该能够在一个循环中对results进行所有必需的处理。使用Widgets构建_.each(...),然后使用for (var key in Widgets) {...}循环生成的对象时,似乎没什么用。

在单循环中,您可能需要Parse.Promise.when(results.map(...))模式,地图的每个回合都会返回Widget 的承诺。这样,您将所需数据传递到promise链中,而不是在外部作用域中构建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);
        });
    });
});