web-dev-qa-db-ja.com

AngularJS:関数からデータを返し、それを変数に割り当てる

Angularjsは初めてで、関数から別の関数にデータを返して変数に格納しようとしています。

$scope.myNameValidate = function(name){
    $scope.friendsList = $scope.getAllFriends(name);
    console.log("data", $scope.friendsList);
}

$scope.getAllFriends = function(name){
    friendService.getAllfriends(name) 
    .then(function(data){
        //success
        console.log(data);
    }, function(err){
        //error
    })
}

すべてのオブジェクトを変数に格納したいのですが、結果として未定義になります。

コンソールに出力

未定義のデータ

[オブジェクト、オブジェクト、オブジェクト、オブジェクト、オブジェクト、オブジェクト]

6
Raghav

Angular promise を知る必要があります。

この問題は 非同期 操作に関連しています。

適切なthenableチェーニングを使用して修正できます。この方法でそれを行うことができます。

$scope.myNameValidate = function(name) {
    $scope.getAllFriends(name)
        .then(function(data) {
            $scope.friendsList = data;
            console.log(data);
        }, function(err) {
            //error
        });

}

$scope.getAllFriends = function(name) {
    return friendService.getAllfriends(name)

}
8
RIYAJ KHAN

なぜ未定義なのか?

あなたの関数$scope.getAllFriends()は、魔女が$ scope.friendsListにデータを設定できるものを何も返していません。

function myFunc(){
 var i = 5;
}
var myVar = myFunc();

myVar will not have value 5.

function myFunc(){
 var i = 5;
return i;
}
var myVar = myFunc();

angularでは、$ scopeに設定したときに非同期データであっても、データが到着するとすぐにangularによってビューとスコープが更新されます。

2
Jorawar Singh

この方法で非同期コールバックを使用することはできません。特定のケースでは、成功のコールバック内で$ scope.friendsListを設定する必要があります。

$scope.myNameValidate = function(name) {
    $scope.getAllFriends(name);
}

$scope.getAllFriends = function(name) {
    friendService.getAllfriends(name) 
    .then(function(data) {
        $scope.friendsList = data;
        console.log("data", $scope.friendsList);
    }, function(err){
        //error
    })
}
1
Alexey Katayev
$scope.myNameValidate = function(name){
$scope.friendsList = $scope.getAllFriends(name)
   .then(function(data){
    //here is your data
   })
  .catch(error){
   //Error
   }
console.log("data", $scope.friendsList);
}

$scope.getAllFriends = function(name){
  var promise = friendService.getAllfriends(name) 
   .then(function(data){
     return data;
  }, function(err){
    //error
 })
 return promise;
 }

これは非同期呼び出しなので、未定義になります

1