延期反模式承诺不明确的例子



来自

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...实际返回的是什么呢?

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

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

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

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

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

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

最新更新