代码之家  ›  专栏  ›  技术社区  ›  Dreamwalker

angularjs中的链式Promise

  •  0
  • Dreamwalker  · 技术社区  · 11 年前

    我是一个刚接触棱角分明的人,我正在努力思考我应该如何创造一个特定的承诺。我也在使用打字脚本进行编码。

    我需要调用一个web服务来进行身份验证。这需要分两个步骤完成。

    步骤1

    请求身份验证密钥

    步骤2

    使用身份验证密钥处理登录详细信息,并返回服务以检索登录的用户,如果不正确则返回错误

    所以我创建了一个名为AuthenticationService的角度服务 如下所示(这当然不起作用)

      export class Authentication
        {
            $inject: string[] = ['$http'];
    
            public Authenticate( userName: string, password: string ): ng.IHttpPromise<ApiModel.ApiResult<ApiModel.AuthenticatedUser>>
            {
             $http.post( "/Account/AuthenticationKey", null )
                .then<ApiModel.ApiResult<string>>( result =>
                {
                    var strKey = userName + password; //TODO: Put correct code here!
    
                    var promiseToReturn = $http.post( "/Account/Authenticate", { key: strKey })
                        .then<ApiModel.ApiResult<ApiModel.AuthenticatedUser>>( result =>
                        {
                            return result;
                        });
                });
            }
        }
    

    如何从返回第二个结果的身份验证方法返回具有正确返回类型的promise?

    2 回复  |  直到 11 年前
        1
  •  1
  •   Chandermani    11 年前

    我可以告诉你,在JavaScript中,因为我不熟悉打字脚本。这个想法是创造你自己的承诺,并在你想要的时候解决它。大体上

    var autenticate=function(user,password) {
        var defer=$q.defer();
        $http.post( "/Account/AuthenticationKey", null )
          .then(function(data) {
             //do something on data
             $http.post( "/Account/Authenticate", { key: strKey })
               .then(function(result) {
                  defer.resolve(result)
             });
          })
        return defer.promise;
    }
    
        2
  •  1
  •   ganaraj    11 年前

    A. then 函数应该始终返回另一个promise或返回值。决赛 然后 函数应该返回一个值,该值将被传播到顶部。

    相关文件可在此处找到: https://github.com/kriskowal/q

    注意: Angular的promise实现是基于kriskowal的q。

    这是文件的相关部分:

    如果promiseMeSomething返回一个稍后用实现的承诺 返回值,第一个函数(履行处理程序)将是 使用值调用。但是,如果promiseMeSomething函数 稍后被抛出的异常拒绝,第二个函数( 拒绝处理程序)将与异常一起被调用。

    就你而言,你应该做这样的事情

    export class Authentication
    {
        $inject: string[] = ['$http'];
    
        public Authenticate( userName: string, password: string ): ng.IHttpPromise<ApiModel.ApiResult<ApiModel.AuthenticatedUser>>
        {
         return $http.post( "/Account/AuthenticationKey", null )
            .then<ApiModel.ApiResult<string>>( result =>
            {
                var strKey = userName + password; //TODO: Put correct code here!
    
                return $http.post( "/Account/Authenticate", { key: strKey })
                    .then<ApiModel.ApiResult<ApiModel.AuthenticatedUser>>( result =>
                    {
                        return result;
                    });
            });
        }
    }
    

    注意在 $http.posts 你正在打电话。全部的 $http Angular中的方法返回一个promise,这意味着您不需要显式地创建另一个promise。