我正在尝试让服务兑现承诺,但一直在获取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中,在deferredpromise 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);
});

08-15 14:27