我正在调用函数一定次数从列表数组中获取单个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的结尾。它甚至不能将返回值识别为数组。
答案 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;
})