这
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...
实际返回了什么?
答案 0 :(得分:2)
要记住的一点是,resolve
和reject
函数都返回promise
。换句话说,它已经为你承诺了。即使您没有明确地从resolve
返回某些内容,您获得的是已使用undefined
值解析的承诺。
在您的示例中,MotorRestangular.all('Motors').getList()
返回一个承诺,并在resolve
函数中,then
中的第一个参数,返回另一个resolved
承诺,这将获得结果_.map
作为输入。它就像:
function YourCtrl(Configurations) {
Configurations.getConfiguration().then(function(resultOfMap) {
// use resultOfMap here
})
}
注意:的
不要被resolved
和onFulfilled
弄糊涂。它们有点相同,但前者用于deferred
对象,后者来自Promise规范。
答案 1 :(得分:1)
MotorRestangular.all('Motors').getList()
是MotorRestangular
返回的承诺。只要您将被调用函数return
作为一个承诺,就可以轻松地在方法之间链接承诺。