如何使用$ q从AngularJS服务返回已解决的承诺?

use*_*820 45 javascript promise angularjs angular-promise

我的服务是:

myApp.service('userService', [
  '$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {
    var deferred;
    deferred = $q.defer();
    this.initialized = deferred.promise;
    this.user = {
      access: false
    };
    this.isAuthenticated = function() {
      this.user = {
        first_name: 'First',
        last_name: 'Last',
        email: 'email@address.com',
        access: 'institution'
      };
      return deferred.resolve();
    };
  }
]);
Run Code Online (Sandbox Code Playgroud)

config通过以下方式在我的文件中调用它:

myApp.run([
  '$rootScope', 'userService', function($rootScope, userService) {
    return userService.isAuthenticated().then(function(response) {
      if (response.data.user) {
        return $rootScope.$broadcast('login', response.data);
      } else {
        return userService.logout();
      }
    });
  }
]);
Run Code Online (Sandbox Code Playgroud)

但是,它抱怨说这then不是一个功能.我不回复已解决的承诺吗?

And*_*aus 98

如何在Angular中简单地返回预先解析的promise

已解决的承诺:

return $q.when( someValue );    // angular 1.2+
return $q.resolve( someValue ); // angular 1.4+, alias to `when` to match ES6
Run Code Online (Sandbox Code Playgroud)

拒绝的承诺:

return $q.reject( someValue );
Run Code Online (Sandbox Code Playgroud)

  • 这正是我所寻找的.在删除http服务调用时返回静态值的简短方法. (2认同)

mcc*_*inz 34

退还你的承诺,退回deferred.promise.
承诺API具有'then'方法.

https://docs.angularjs.org/api/ng/service/$q

调用resolve不会返回一个promise,它只表示promise被解决的承诺,因此它可以执行'then'逻辑.

基本模式如下,冲洗并重复
http://plnkr.co/edit/fJmmEP5xOrEMfLvLWy1h?p=preview

<!DOCTYPE html>
<html>

<head>
  <script data-require="angular.js@*" data-semver="1.3.0-beta.5" 
        src="https://code.angularjs.org/1.3.0-beta.5/angular.js"></script>
  <link rel="stylesheet" href="style.css" />
  <script src="script.js"></script>
</head>

<body>

<div ng-controller="test">
  <button ng-click="test()">test</button>
</div>
<script>
  var app = angular.module("app",[]);

  app.controller("test",function($scope,$q){

    $scope.$test = function(){
      var deferred = $q.defer();
      deferred.resolve("Hi");
      return deferred.promise;
    };

    $scope.test=function(){
      $scope.$test()
      .then(function(data){
        console.log(data);
      });
    }      
  });

  angular.bootstrap(document,["app"]);

</script>
Run Code Online (Sandbox Code Playgroud)

  • 您在返回deferred.promise之前解决了延迟. (2认同)

Bro*_*cco 20

从您的服务方式:

function serviceMethod() {
    return $timeout(function() {
        return {
            property: 'value'
        };
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

在你的控制器中:

serviceName
    .serviceMethod()
    .then(function(data){
        //handle the success condition here
        var x = data.property
    });
Run Code Online (Sandbox Code Playgroud)

  • 这可能有用,但肯定不是推荐的返回承诺的方法 (11认同)
  • 啊好吧,但即使出于其他原因,我仍然同意他的观点!我很欣赏downvote是令人沮丧的,我们可以使用upvotes帮助好的内容浮动到顶部,但在这种情况下我觉得你的答案没有帮助,因为它无法解释$ q的机制,而是呈现$ q的抽象.对承诺不熟悉的人,或者像我熟悉承诺但是对Angular不熟悉的人,可能会完全错误地结束! (3认同)