问题陈述:我有一个角度js函数从服务中获取数据,我连接一些列然后返回连接数据。
Angular JS功能:
$("select").on("change", function() {
alert("hello");
});
当函数被调用时,返回 undefined :
$scope.findCompanyAddressById = function( cmpId ) {
var address = "";
$http.get(someUrl+'/company/find?id='+cmpId ).
then(function(response) {
$scope.company = response.data;
for( var i=0; i < $scope.company.locations.length; i++ ) {
address += " " + $scope.company.locations[i].street1
address += " " + $scope.company.locations[i].street2
address += " " + $scope.company.locations[i].city
address += " " + $scope.company.locations[i].state
address += " " + $scope.company.locations[i].zip
console.log( "Rendering address: " );
console.log( address ); // logs perfect data.
}
});
return address;
}
关于如何从上述函数返回连接数据的任何想法。
答案 0 :(得分:1)
它是异步数据。您不知道它何时到达(200毫秒后或一分钟后),因此您无法将其分配给变量。您需要使用 promises - 异步回调。
您的服务应如下所示:
$scope.findCompanyAddressById = function(cmpId) {
return $http.get(someUrl + '/company/find?id=' + cmpId).
then(function(response) {
var address = "";
$scope.company = response.data;
for (var i = 0; i < $scope.company.locations.length; i++) {
address += " " + $scope.company.locations[i].street1
address += " " + $scope.company.locations[i].street2
address += " " + $scope.company.locations[i].city
address += " " + $scope.company.locations[i].state
address += " " + $scope.company.locations[i].zip
}
return address;
});
}
简而言之:return $http.get(url).then((res)=>{return ...});
您需要返回来获取$http
的承诺和您的数据。
然后您的其他代码可以:
$scope.findCompanyAddressById( 1 ). // works as a promise
then((data)=>{
$scope.concatenatedData = data;
})
或者您可以将其传递给您的控制器(function($scope,YourService)
)并执行相同操作:
YourService.findCompanyAddressById( 1 ).then(...)
答案 1 :(得分:1)
$ http.get是异步的,并返回承诺,您可以使用然后来处理。因此,您需要在解决承诺之前返回变量地址。
有很多方法可以解决这个问题,但这将是我的方式:
$scope.findCompanyAddressById = function( cmpId ) {
return $http.get(
someUrl+'/company/find?id='+cmpId ).
then(function(response) {
var address = '';
$scope.company = response.data;
for( var i=0; i < $scope.company.locations.length; i++ ) {
address += " " + $scope.company.locations[i].street1
address += " " + $scope.company.locations[i].street2
address += " " + $scope.company.locations[i].city
address += " " + $scope.company.locations[i].state
address += " " + $scope.company.locations[i].zip
console.log( "Rendering address: " );
console.log( address ); // logs perfect data.
}
return address;
})
};
现在你的函数返回了promise。你可以这样使用它:
$scope.findCompanyAddressById( 1 )
.then(function(address){
$scope.concatenatedData = address;
})
这是关于Promise的MDN文档。
修改强>
返回一个新的Promise是一个反模式,所以该函数现在返回$ http.get的承诺。
答案 2 :(得分:0)
为了帮助解决问题,您必须先了解promises。 Promise是异步的,因此,它们不能保证立即返回。想一下承诺&#34;嘿,我承诺我会为你做一些工作,然后当我完成时,我&#39 ;给你结果&#34;。这通常用于返回服务器的HTTP调用。
异步代码最酷的一点是,它允许您在执行异步代码时执行其他一些工作。这就是你正在经历的事情。
请注意,您的return address
外 .then
功能。要实际查看操作中的异步性质,请在console.log
语句前面加return
,在.then
内加一个$scope.findCompanyAddress(1).then(address => {
/* do something with address */
})
。您将看到返回前的console.log实际上是先执行的!
话虽如此,您仍然无法使用异常代码,就像您以前使用的其他代码一样。 一旦进入承诺,你真的无法逃脱&#34;它。从现在开始,您需要继续将这个承诺链接到数据上。
$http.get
希望这有帮助!
修改强>
忘记提及这意味着您现在需要从函数而不是地址(Reduce
部分)返回承诺。