我有一个承诺的问题,
$scope.refreshProject = function () {
project.getAll().then(function(results) {
angular.forEach(results, function(project) {
project_path = project.path;
project_file = project.file;
project_id = project.id;
console.log(project);
console.log('http://' + project_path + '/' + project_file);
$http.get('http://' + project_path + '/' + project_file)
.then(function(res){
var project = new Project();
project.update(project_id, { 'content': res.data });
});
});
$scope.refresh();
});
};
我的$ http.get无效,
console.log(' http://' + project_path +' /' + project_file);
返回
' http:///'
我的变量是空的。
project.model.js
Project.prototype.getAll = function () {
return ProjectService.getAll();
};
project.service.js
this.getAll = function (params) {
var projects = [];
return db.selectAll('projects').then(function(results) {
for(var i=0; i < results.rows.length; i++){
projects.push(results.rows.item(i));
}
return projects;
});
};
当我从project.path和project.file获取params时,如何执行我的$ http请求?
解决
project.getAll().then(function(results) {
angular.forEach(results, function(project) {
(function(project) {
var project_id = project.id;
if (project.path) {
var promise = $http.get(project.path + '/' + project.file)
.then(function(res){
var project = new Project();
console.log(res.data);
project.update(project_id, { 'content': res.data });
});
}
promises.push(promise);
})(project);
});
$q.all(promises).then(function() {
$scope.refresh();
console.log('refresh() ok');
});
});
答案 0 :(得分:1)
首先,检查results
是否包含正确的数据 - 那些console.logs
为空的表明它不是,并且projectService.getAll()
没有返回您的预期。
假设它按预期工作,您有三个单独的变量,全部命名为“project”:
project.getAll().then(function(results) {
// ^^^^^^^ 1
angular.forEach(results, function(project) {
// ^^^^^^^ 2
project_path = project.path;
// ^^^^^^^ 2
// ...
$http.get('http://' + project_path + '/' + project_file).then(function(res){
var project = new Project();
// ^^^^^^^ 3
我真的不知道其中哪一个覆盖了其他哪一个,特别是因为涉及异步代码 - 但我敢打赌至少其中一个必须是镍。
如果没有其他任何改变不同名称的东西将使维护和调试更容易......
答案 1 :(得分:0)
狂野猜测:取决于angular.forEach
的工作方式,像这样包装你的回调可能会这样做。
(否则可能会使用project
的最新版本调用所有回调,更多详细信息请JavaScript closure inside loops – simple practical example)
$scope.refreshProject = function () {
project.getAll().then(function(results) {
angular.forEach(results, function(project) {
(function(project) {
project_path = project.path;
project_file = project.file;
project_id = project.id;
console.log(project);
console.log('http://' + project_path + '/' + project_file);
$http.get('http://' + project_path + '/' + project_file)
.then(function(res){
var project = new Project();
project.update(project_id, { 'content': res.data });
});
})(project);
});
$scope.refresh();
});
};