推迟反承诺的模式不明确的例子

时间:2015-09-29 23:16:48

标签: javascript angularjs promise

https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns

他在谈论什么承诺?

myApp.factory('Configurations', function (Restangular, MotorRestangular, $q) {
    var getConfigurations = function () {
        //Just return the promise we already have!
        return MotorRestangular.all('Motors').getList().then(function (Motors) {
            //Group by Cofig
            var g = _.groupBy(Motors, 'configuration');
            //Return the mapped array as the value of this promise
            return _.map(g, function (m) {
                return {
                    id: m[0].configuration,
                    configuration: m[0].configuration,
                    sizes: _.map(m, function (a) {
                        return a.sizeMm
                    })
                }
            });
        });
    };

    return {
        config: getConfigurations()
    }

});

承诺在哪里?对我来说,看起来更像是使用他的模式的反模式。除了单词then之外,我在这段代码中看不到任何承诺。没有什么能让我想到一个承诺。

那么return MotorRestangular...实际返回了什么?

2 个答案:

答案 0 :(得分:2)

要记住的一点是,resolvereject函数都返回promise。换句话说,它已经为你承诺了。即使您没有明确地从resolve返回某些内容,您获得的是已使用undefined值解析的承诺。

在您的示例中,MotorRestangular.all('Motors').getList()返回一个承诺,并在resolve函数中,then中的第一个参数,返回另一个resolved承诺,这将获得结果_.map作为输入。它就像:

function YourCtrl(Configurations) {
    Configurations.getConfiguration().then(function(resultOfMap) {
        // use resultOfMap here
    })
}

注意:的 不要被resolvedonFulfilled弄糊涂。它们有点相同,但前者用于deferred对象,后者来自Promise规范。

答案 1 :(得分:1)

MotorRestangular.all('Motors').getList()

MotorRestangular返回的承诺。只要您将被调用函数return作为一个承诺,就可以轻松地在方法之间链接承诺。