来自
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...
实际返回的是什么呢?
resolve
和reject
函数都返回一个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
})
}
注意:不要被resolved
和onFulfilled
弄糊涂。它们有点相同,但前者用于deferred
对象,后者来自Promise规范。
MotorRestangular.all('Motors').getList()
是MotorRestangular
返回的承诺。只要将调用的函数return
设为promise,就可以轻松地在方法之间链接promise。