嗨,我是棱角分明的新人,想要了解承诺。我在另一个内部有2个http get(嵌套)。我想使用inside循环的值来形成外部get语句的链接,如下所示。
$scope.loadtable = function (task){
var bgUrl = "cloudantlink";
$http.get(bgUrl)
.success(function (response) {
$scope.fileTableData =[];
for(var i =0;i<response.rows.length;i++){
var fileUrl = "cloudantURL";
$http.get(fileUrl, {responseType:'arraybuffer'})
.success(function (response) {
var file = new Blob([response], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
$scope.content = $sce.trustAsResourceUrl(fileURL);
console.log("this is value of promise inside loop", $scope.content);
}).error(function(data){
});
console.log("this is value of promise outside loop",$scope.content);
var fileTableEntry = {
'download' : '<a href=\"'+$scope.content+'\">' + $scope.content+'</a>',
};
$scope.TableData.push(TableEntry);
}
$scope.loadTable();
}).error(function(data){
});
};
$ scope.content值始终未定义或在第二个循环之外为null。有人可以建议我将值传递给第一个get语句。
答案 0 :(得分:0)
$http.get
或任何异步操作只能在后台运行,并且您在其后写的任何语句都不会实际等待此操作完成。
如果要在代码完成后运行代码,则必须使用它返回的.then
的{{1}}方法。
在这种情况下,您可能希望等待所有这些操作完成,然后调用Promise
及相关内容。
要执行此操作,请保存请求返回的承诺,并等待 $scope.loadTable
来解决。不要忘记将$ q添加到控制器的依赖项中。
$q.all
您每次都会覆盖var fileRequests = [];
for(...) {
fileRequests.push($http.get(fileUrl)
.then(function success(response) { ... return fileUrl; }))
}
$q.all(fileRequests).then(function(fileUrls) { .. $scope.loadTable() })
,我认为您打算在$scope.content
中保存网址。
完整代码:
$scope.fileTableData[i]