AngularJS从服务功能中获取价值

时间:2016-11-20 16:03:14

标签: angularjs asynchronous q

我在控制器中获取服务价值时遇到问题。 我使用服务从API获得了价值:

import pandas as pd
from sklearn import linear_model

def rolling_beta(X, y, idx, window=255):

    assert len(X)==len(y)

    out_dates = []
    out_beta = []

    model_ols = linear_model.LinearRegression()

    for iStart in range(0, len(X)-window):        
        iEnd = iStart+window

        model_ols.fit(X[iStart:iEnd], y[iStart:iEnd])

        #store output
        out_dates.append(idx[iEnd])
        out_beta.append(model_ols.coef_[0][0])

    return pd.DataFrame({'beta':out_beta}, index=out_dates)


df_beta = rolling_beta(df_rtn_stocks['NDX'].values.reshape(-1, 1), df_rtn_stocks['CRM'].values.reshape(-1, 1), df_rtn_stocks.index.values, 255)

我试图在控制器中获取和使用值:

angular.module('app').factory('service',
  ['$q', '$rootScope', '$timeout', '$http',
  function ($q, $rootScope, $timeout, $http) {

    // create user variable
    var user = null;

    // return available functions for use in the controllers
    return ({
      isLoggedIn: isLoggedIn,
      getUserStatus: getUserStatus,
      login: login,
      getEmail: getEmail
    });

    function isLoggedIn() {
      if(user) {
        return true;
      } else {
        return false;
      }
    }

    function getUserStatus() {
      return $http.get('/user/status')
      // handle success
      .success(function (data) {
        if(data.status){
          user = true;
        } else {
          user = false;
        }
      })
      // handle error
      .error(function (data) {
        user = false;
      });
    }

function login(username, password) {

      // create a new instance of deferred
      var deferred = $q.defer();

      // send a post request to the server
      $http.post('/user/login',
        {username: username, password: password})
        // handle success
        .success(function (data, status) {
          if(status === 200 && data.status){
            user = true;
            deferred.resolve();
          } else {
            user = false;
            deferred.reject();
          }
        })
        // handle error
        .error(function (data) {
          user = false;
          deferred.reject();
        });

      // return promise object
      return deferred.promise;

    }

    function getEmail() {
      // create a new instance of deferred
      var deferred = $q.defer();

      $http.get('/email/'+$rootScope.username)
        .success(function (data) {
          console.log(data);
          deferred.resolve();
      })
      .error(function (data) {
        deferred.reject();
      })

      return deferred.promise;
    }
}]);

但在控制器中有angular.module('app') .controller('myController', ['$rootScope', '$scope', '$state', '$http', '$q', 'service', function ($rootScope, $scope, $state, $http, $q, service) { $scope.email; $scope.getEmail = function() { // call getEmailFromDB from service service.getEmail() // handle success .then(function (data) { $scope.email = data; //here I got undefined console.log($scope.email); }) // handle error .catch(function () { $scope.error = true; $scope.errorMessage = "wrong@mail.com"; }); }; $scope.getEmail(); }]); 值。

在我的控制台中: enter image description here

关于$ q的文档,我在服务和控制器中使用undefined函数。

有人知道问题在哪里吗?

2 个答案:

答案 0 :(得分:1)

您忘了将结果发送到您的服务中

deferred.resolve(data);

答案 1 :(得分:1)

在您的代码中,您没有回复任何承诺,为此,您必须致电deferred.resolve(data)deferred.reject(data)

您可以直接返回$ http请求,而不是创建延迟对象。 例如:

function getEmail() {
    return $http.get('/email/'+$rootScope.username).then(
        function success(data){
            console.log(data);
            return data;
        }, 
        function error(data){
            console.error(data);
        }
    );
}

另请注意,.success().error()已弃用,您应使用.then()并传递successerror个功能。