For循环以错误的顺序返回promises

时间:2016-04-08 21:48:36

标签: javascript angularjs

我正在调用函数一定次数从列表数组中获取单个src属性。 src属性以错误的顺序返回。我已经尝试过使用setTimeout但是返回一个空数组,而我自己的暂停函数只是在一定时间后返回相同的列表顺序。

此处调用该函数:

  myLoopingFunction: function(links) {
    var pause = function sleep(milliseconds) {
      var currentTime = new Date().getTime();
      while (currentTime + milliseconds >= new Date().getTime()) {
      }
    }
    var deferred = $q.defer();
    var promise = deferred.promise;
    var src = [];
    for (var i = 0;i < links.length;i++) {
      getSrc(links[i]).then(function(response) {
        src.push(response)
      });
    }
    deferred.resolve(src);
    return deferred.promise;
  }

编辑: 这是功能:

     var getSrc = function(links) {
      return $q.all(links.map(function(link){
         return $http.get(link.Address);
     })).then(function(results){
         var src = results.map(function(result){
           var tmp = document.implementation.createHTMLDocument();
           tmp.body.innerHTML = result.data;
           var video = $(tmp.body.children).find('#definitionblock iframe');
           var video_src = $(video[0]).attr("src");
           return video_src;
         });
     })
  };

这里被称为:

      bslLogin.getSrc($scope.links).then(function(response) {
        $scope.videos = response;
        console.log($scope.videos);
      })

它现在返回undefined。我可以通过console.logs看到函数链正在产生正确的结果,直到它返回undefined的结尾。它甚至不能将返回值识别为数组。

1 个答案:

答案 0 :(得分:1)

您必须使用$q.all()按预期顺序获取“http-promises”的结果。在您的代码中,http调用是异步(并发)和回调处理程序,它们也会对数组添加响应。

这可能是一系列承诺的解决方案(小心,代码未经测试):

$q.all(links.map(function(link){
    return $http.get(link.Address);
})).then(function(results){
    var src = results.map(function(result){
        var tmp = document.implementation.createHTMLDocument();
        tmp.body.innerHTML = response.data;
        var video = $(tmp.body.children).find('#definitionblock iframe');
        var video_src = $(video[0]).attr("src");
        console.log(video_src);
        return video_src;
    });
    return src;
})