2016-04-15 15 views
1

私はAngularJSを初めて使用しており、.foreachループを使用してhttpリクエストを送信しようとしています。ここで私は、コンソール2を組み合わせ、「res.data.title」と表示されます期待されていた私のコードはAngularJSを使用して変数を更新できません

app.controller('myCtrl', function($scope, $http) { 
var rd; 
$http.get(furl,config).then(function mySucces(response) { 
rd = response.data; 
var webcontent = ""; 
angular.forEach(rd, function(rd1){ 
    $http.get(furl1 + rd1.slug,config).then(function(res){   
    webcontent += res.data.title; 
    console.log(webcontent);//console 1 
    }); 
}); 
console.log(webcontent);//console 2 
$scope.myWelcome = webcontent; 
}, function myError(response) {$scope.myWelcome = response.statusText;});}); 

だ、しかし、それだけで初期値を示しています。(この場合は空になっています)。コンソールログ1が正しく表示されています - 増加する "webcontent"変数を一覧表示します。 "webcontent"(コンソール2)の更新値を保持する方法がわかりません。どんな反応もありがとう!ありがとう!

+0


最後に、あなたのスニペットは、そのようなものである可能性があります。 – Hitmands

答えて

1

これは角度の問題ではありませんが、これは非同期のjavascriptの問題です。約束が完了する前にコードが終了しました。あなたはそうのように、解決するために、すべての約束を待つために、クエリライブラリを使用することができます

app.controller('myCtrl', function($scope, $http, $q) { 
    var rd; 
    $http.get(furl, config).then(function mySucces(response) { 
     rd = response.data; 
     var webcontent = ""; 
     var promises = []; 

     angular.forEach(rd, function(rd1) { 
      promises.push($http.get(furl1 + rd1.slug, config); 
     }); 

     $q.all(promises).then(function (results) { 
      angular.forEach(results, function (result) { 
       webcontent += result.data.title; 
      } 

      $scope.myWelcome = webcontent; 
     }); 
    }, function myError(response) { 
     $scope.myWelcome = response.statusText; 
    }); 
}); 
0

あなただけの完全WebContentの変数を削除し、それの場所に直接$scope.myWelcome変数を更新し、それがその後、動作するはずでした。だから、:

​​3210
+0

これは、AJAX呼び出しが順番に完了した場合にのみ機能します。彼らが順番に戻ってくる可能性が高いです。 –

+0

@MikeRobinsonそれは本当ですが、この場合、それらを順不同にすることは問題ですか?そうであれば、結果を含むオブジェクトの配列を作成し、必要に応じて並べ替えることができます。 –

+0

彼はウェルカムメッセージを生成していると考えていますが、その順序は非常に重要です。実際にメッセージを送ってもらえるかどうかは、返されていることがわからないので、難しいです。それにもかかわらず、リクエストの順序を維持するために$ q.allを使用するだけで、注文の問題全体を回避することができます。 –

0

Ajaxはを呼び出しますが、彼らは似たようなwindow.setTimeoutしている、常に非同期タスクです。コードタスクをタスクごとに書くことは不可能です。見て:

console.log(1); 
 
window.setTimeout(console.log.bind(console, 2)); 
 
console.log(3);

非同期タスクが(将来的に)、その後のイベントループ内で実行されているので、これが起こります。 Ajaxの呼び出しは非同期であり、あなたは何をやっていることができないので

$http 
 
    .get(furl, config) 
 
    .then(function(response) { return response.data; }) 
 
    .then(function(resources) { 
 
    return $q.all(resources.map(function(resource) { 
 
     return $http.get(furl1 + resource.slug, config); 
 
    })); 
 
    }) 
 
    .then(function(results) { 
 
    return results.map(function(result) { 
 
     return result.data.title; 
 
    }).join(''); 
 
    }) 
 
    .catch(function(response) { 
 
    return response.statusText; 
 
    }) 
 
    .then(function(greetings) { 
 
    $scope.myWelcome = greetings; 
 
    }) 
 
;

関連する問題