我正在尝试让服务兑现承诺,但一直在获取PushService.initPush.then is not a function
这是我的服务:
app.service('PushService', function($log, $q, $ionicPopup) {
return {
initPush: function() {
var deferred = $q.defer();
MFPPush.initialize (
function(successResponse) {
console.log("Successfully intialized push: " + successResponse);
deferred.resolve();
},
function(failureResponse) {
console.log("Failed to init push: " + JSON.stringify(failureResponse));
deferred.resolve();
}
)
return deferred;
}
}
}
而我的控制器:
PushService.initPush.then(function(response) {
console.log(response);
})
但是正在得到
PushService.initPush.then is not a function
为什么这种情况持续发生,对我来说,好像我正在兑现承诺?我一直在遵循本教程http://chariotsolutions.com/blog/post/angularjs-corner-using-promises-q-handle-asynchronous-calls/,并查看了这样的问题Processing $http response in service,但无法使其正常工作。谢谢您的帮助
最佳答案
首先,您需要调用initPush
方法,而不仅仅是访问其属性。
其次,在$q
中,在deferred
和promise
API之间的区别不是那么微妙:前者是关于修改其状态的,而后者是在结算(解决或拒绝)时决定要做什么。因此,您实际上需要返回deferred.promise
(而不是deferred
)。
最后,我建议改为使用$ q构造函数模式,如下所示:in the doc:
initPush: function() {
return $q(function(resolve, reject) {
MFPPush.initialize(
function(successResponse) {
console.log("Successfully intialized push: " + successResponse);
resolve(successResponse);
},
function(failureResponse) {
console.log("Failed to init push: " + JSON.stringify(failureResponse));
reject(failureResponse);
}
);
});
}
事实上,如果您不需要在此处登录,则可以将其写成...
return $q(function(resolve, reject) {
MFPPush.initialize(resolve, reject);
});