2014-10-20 61 views
0

我想在我的控制器之一中使用promise来实现一个基本功能,以便在添加更复杂的功能之前确保它正常工作。我得到一个“类型错误:未定义的是不是一个功能”上的“然后(功能(数据){”在lockPromise方法在angularjs控制器中的承诺 - 如何实现

功能从视图

$scope.lockPromise = function(fieldId) { 
     $scope.getLockMessage2(fieldId).getWeather() 
      .then(function(data) { 
       if (data === "returned SUCCESS info") { 
        alert("data is good"); 
       } else { 
        alert("FAILED"); 
       } 
      }, function(error) { 
       alert(error); 
      }); 
    }; 

二函数调用。在CTRL

$scope.getLockMessage2 = function(fieldId) { 
     return{ 
      getWeather: function() { 
       return $http.get('/api/getData') 
        .then(function(response) { 
         if (typeof response.data === "string") { 
          return response.data; 
         } else { 
          return $q.reject(response.data); 
         } 
        }, function(response) { 
         return $q.reject(response.data); 
        }); 
      } 
     }; 
    }; 

API GET

[Route("api/getData")] 
public HttpResponseMessage GetData() 
    { 

     string data = JsonConvert.SerializeObject("returned SUCCESS info"); 

     return new HttpResponseMessage 
     { 
      Content = new StringContent(data, Encoding.UTF8, "application/json") 
     }; 
    } 

编辑1: 代码更新,以反映意见

+3

那'2nd'功能应该是在服务页面,而比内部控制器的启动。你几乎就在那里,只需要在你返回数据的地方做一些小改动。请参阅http://chariotsolutions.com/blog/post/angularjs-corner-using-promises-q-handle-asynchronous-calls/ – 2014-10-20 10:15:47

+1

'$ scope.getLockMessage2(fieldId).getWeather()'你正在返回对象而不是函数 – harishr 2014-10-20 10:22:05

+0

@RoyMJ我打算在测试后把它放入一个服务中 - 我知道这是微不足道的,但是服务的必要性是什么? – alsco77 2014-10-20 10:23:41

回答

1

变化

$scope.getLockMessage2(fieldId).then 

$scope.getLockMessage2(fieldId).getWeather().then 
0

你$ scope.getLockMessage2返回一个对象,无法正常工作。

我认为的代码应(未测试):

$scope.lockPromise = function(fieldId) { 
    $scope.getLockMessage2(fieldId).getWeather() 
     .then(function(data) { 
      if (data === "good") { 
       alert("data is good"); 
      } else { 
       alert("FAILED"); 
      } 
     }, function(error) { 
      alert(error); 
     }); 
};