2016-04-08 9 views
0

リストの配列から個別のsrc属性をフェッチするために、関数をある程度呼び出しています。 src属性の順序が間違っています。私はsetTimeoutを使用しようとしましたが、nullの配列を返し、ちょうどミリ秒後に特定の量だけリストの同じ順序を返します。Forループが約束を間違った順序で返す

機能はここに呼び出されます。

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; 
    } 

EDIT:それはここに呼ばれています

 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; 
     }); 
    }) 
    }; 

:それは今、undefinedを返します

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

これは、関数です。私はconsole.logsを見れば、関数の連鎖が最終的に正しい結果を生成していることがわかります。戻り値を配列として認識することさえできません。

+0

約束を返すされていません。コールバックは結果を配列に挿入しますが、コールバックは非同期であるため、順番に実行することはほとんどありません。 –

+0

また、遅すぎる方法を早期に解決しています。 –

答えて

1

「http-promises」の結果を期待通りの順序で得るには、$q.all()を使用する必要があります。あなたのコードでは、http呼び出しは非同期(並行)で実行され、コールバックハンドラも配列に応答を加えます。

この約束のアレイを有する溶液とすることができる(注意して、コードがテストされていない):forループ

$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; 
}) 
+1

これは角度です。 '$ q.all'を使用してください – acbabis

+0

ああ、ありがとう。答えは –

+0

だから私はかなりループ関数を取り出して、ちょうどgetSrcを使った。私が$ q.allを返すとき、私は未定義の結果を得ます。 ($ scope.videos);$ scope.videos =レスポンス; console.log($ scope.videos); }) '私が$ qを返さない場合は、' bslLogin.getSrc($ scope.links) .all私は "未定義のプロパティを読み取ることができません"というエラーが発生しました – Inalek

関連する問題