AngularJS HTTP post 通过 for 循环调用
AngularJS HTTP post call thru a for loop
我有一个数组,我正在将其传递给将发布到 API 的有效载荷。在数组中是 API 将单独使用的字段名称(而不是作为数组),因此我创建了一个 for 循环来遍历数组并将字段名称动态添加到有效负载中。但是当我打电话时,我只得到最后一个字段名的数据。如果我说数组中总共有 6 个项目,我只获取最后一个字段的数据。
function getData(payload, index, field) {
var deferred = $q.defer();
for (var i = 0; i < field.length; i++) {
if (field[i]) {
console.log("terms logged", field[i]);
var termsData = {
user_selection: payload,
index_info: index,
field: field[i]
};
console.log("terms data", termsData);
}
}
$http({
url: 'API',
method: "POST",
data: $.param(termsData),
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function (response) {
var data = response.data;
console.log("response data", data);
deferred.resolve(data);
});
return deferred.promise;
}
我需要在初始调用后重复循环吗?由于它在一个for循环中,我假设调用会一个接一个地进行,直到满足条件。
我相信您正在寻找的是一种在循环中链接承诺的方法。这可以通过将承诺存储在数组中来实现,如下所示:
var promises = [];
for(...) {
var promise = $http(...); // http calls return a promise
promises.push(promise);
// Or, if you prefer to use $q
var deferred = $q.defer();
$http(...).success(function(){
deferred.resolve();
});
promises.push(deferred);
}
$q.all(promises).then(function(){
// This will be executed when all promises inside the array have been resolved
});
不过,我不建议做那么多请求。如果可能,请更改您的后端,使其能够交替接收对象数组。
这里有一些关于$q的文档https://docs.angularjs.org/api/ng/service/$q
Resolve a promise array with Angular UI Router
这里有几个错误。首先,return deferred.promise;
将在第一次到达时跳出函数。这就是为什么它只发送第一个术语。如果将 return 语句移到 for 循环之外,您应该会发送所有条款。
还应该修复的是,您只有 1 个延迟对象附加到多个调用。每次调用都应该有一个延迟对象。下面是一个例子。
function getData(payload, index, field) {
for (var i = 0; i < field.length; i++) {
if (field[i]) {
console.log("terms logged", field[i]);
var termsData = {
user_selection: payload,
index_info: index,
field: field[i]
};
postTerm(term);
}
}
}
function postTerm(term) {
var deferred = $q.defer();
console.log("terms data", term);
$http({
url: 'API',
method: "POST",
data: $.param(term),
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}).then(function(response) {
var data = response.data;
console.log("response data", data);
deferred.resolve(data);
});
return deferred.promise;
}
我有一个数组,我正在将其传递给将发布到 API 的有效载荷。在数组中是 API 将单独使用的字段名称(而不是作为数组),因此我创建了一个 for 循环来遍历数组并将字段名称动态添加到有效负载中。但是当我打电话时,我只得到最后一个字段名的数据。如果我说数组中总共有 6 个项目,我只获取最后一个字段的数据。
function getData(payload, index, field) {
var deferred = $q.defer();
for (var i = 0; i < field.length; i++) {
if (field[i]) {
console.log("terms logged", field[i]);
var termsData = {
user_selection: payload,
index_info: index,
field: field[i]
};
console.log("terms data", termsData);
}
}
$http({
url: 'API',
method: "POST",
data: $.param(termsData),
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function (response) {
var data = response.data;
console.log("response data", data);
deferred.resolve(data);
});
return deferred.promise;
}
我需要在初始调用后重复循环吗?由于它在一个for循环中,我假设调用会一个接一个地进行,直到满足条件。
我相信您正在寻找的是一种在循环中链接承诺的方法。这可以通过将承诺存储在数组中来实现,如下所示:
var promises = [];
for(...) {
var promise = $http(...); // http calls return a promise
promises.push(promise);
// Or, if you prefer to use $q
var deferred = $q.defer();
$http(...).success(function(){
deferred.resolve();
});
promises.push(deferred);
}
$q.all(promises).then(function(){
// This will be executed when all promises inside the array have been resolved
});
不过,我不建议做那么多请求。如果可能,请更改您的后端,使其能够交替接收对象数组。
这里有一些关于$q的文档https://docs.angularjs.org/api/ng/service/$q
Resolve a promise array with Angular UI Router
这里有几个错误。首先,return deferred.promise;
将在第一次到达时跳出函数。这就是为什么它只发送第一个术语。如果将 return 语句移到 for 循环之外,您应该会发送所有条款。
还应该修复的是,您只有 1 个延迟对象附加到多个调用。每次调用都应该有一个延迟对象。下面是一个例子。
function getData(payload, index, field) {
for (var i = 0; i < field.length; i++) {
if (field[i]) {
console.log("terms logged", field[i]);
var termsData = {
user_selection: payload,
index_info: index,
field: field[i]
};
postTerm(term);
}
}
}
function postTerm(term) {
var deferred = $q.defer();
console.log("terms data", term);
$http({
url: 'API',
method: "POST",
data: $.param(term),
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}).then(function(response) {
var data = response.data;
console.log("response data", data);
deferred.resolve(data);
});
return deferred.promise;
}