Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript For循环成功地将元素添加到数组中,但之后返回空数组_Javascript_Arrays_Angularjs_For Loop - Fatal编程技术网

Javascript For循环成功地将元素添加到数组中,但之后返回空数组

Javascript For循环成功地将元素添加到数组中,但之后返回空数组,javascript,arrays,angularjs,for-loop,Javascript,Arrays,Angularjs,For Loop,因此,这段代码成功地运行并将元素添加到数组中,通过将元素记录到控制台来确认,但在返回数组后,返回的是空的。我整个上午都在用这个把头撞在墙上 details.getDetails = function(idSet, pageNum) { var page = idSet[pageNum], placeDetails = [], i; for(i=0; i<page.length; i++){ ngGPlaces

因此,这段代码成功地运行并将元素添加到数组中,通过将元素记录到控制台来确认,但在返回数组后,返回的是空的。我整个上午都在用这个把头撞在墙上

details.getDetails = function(idSet, pageNum) {
      var page = idSet[pageNum],
          placeDetails = [],
          i;

      for(i=0; i<page.length; i++){
        ngGPlacesAPI.placeDetails({placeId: page[i]})
          .then(function(data){
            response = data;
            placeDetails.push(response);
            console.log(placeDetails) //This shows the loop running and the array being populated
          })
      }
      return placeDetails;
      console.log(placeDetails) //This returns empty array 
    };
details.getDetails=函数(idSet,pageNum){
var page=idSet[pageNum],
placeDetails=[],
我

for(i=0;i这里的问题是.placeDetails会立即返回,因此for循环在您实际检索到一些数据之前就已经完成了。这就是为什么在这里使用承诺并不能真正帮助您,因为解析调用几乎会立即被调用

我建议您在完成对placeDetails的所有呼叫之前,先查看$q.all,然后再解决您的承诺

类似这样的(未经测试的)代码应该适合您。它可能需要一些更改,但应该会给您一个想法

details.getDetails = function(idSet, pageNum) {
      var page = idSet[pageNum],
          placeDetails = [],
          mainDeferred = $q.defer(),
          promises = [];

      for(var i=0; i<page.length; i++){
        var deferred = $q.defer();
        ngGPlacesAPI.placeDetails({placeId: page[i]})
          .then(function(data){
            placeDetails.push(data);
            deferred.resolve();
          });
        promises.push(deferred.promise);
      }
    $q.all(promises).then(function() {
       mainDeferred.resolve(placeDetails); 
    });
    return mainDeferred;
  });
details.getDetails=函数(idSet,pageNum){
var page=idSet[pageNum],
placeDetails=[],
main deferred=$q.deferred(),
承诺=[];

对于(var i=0;iYou正在处理
异步
事件..为什么投票失败?我知道我做错了什么,这就是我问的原因。谢谢你的回答。我运行了上面的代码,它创建了承诺数组,然后返回一个承诺,但当我尝试在控制器中使用该承诺时,代码
details.getDetails(page,pageNum).then(function(response){vm.restaurants=response;console.log(vm.restaurants);})
我没有在控制台上记录任何东西,但也没有发现任何错误。@GrantJordan正如我所说的;我给你的代码是给你一个大概的想法,而不是银盘上的解决方案:-)您可能需要进行一些调试才能正常工作。例如,不要使用全局数组,而是在resolve函数中传递
.placeDetails()
的结果,然后在
$q.all()
中添加所有结果的值。您可以查看有关all()的更多信息功能。非常感谢你让我走上正确的轨道。通过一点调整,我让一切都运转起来。
details.getDetails = function(idSet, pageNum) {
      var page = idSet[pageNum],
          placeDetails = [],
          mainDeferred = $q.defer(),
          promises = [];

      for(var i=0; i<page.length; i++){
        var deferred = $q.defer();
        ngGPlacesAPI.placeDetails({placeId: page[i]})
          .then(function(data){
            placeDetails.push(data);
            deferred.resolve();
          });
        promises.push(deferred.promise);
      }
    $q.all(promises).then(function() {
       mainDeferred.resolve(placeDetails); 
    });
    return mainDeferred;
  });