如何编写Angular JS函数来返回值

时间:2018-01-30 09:13:36

标签: javascript angularjs

问题陈述:我有一个角度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;
}

关于如何从上述函数返回连接数据的任何想法。

3 个答案:

答案 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部分)返回承诺。