我有这个API调用,我确保数据以我发送的相同顺序返回。但是,我意识到这不是我想要的,我想确保数据一次发送和处理。
发送数据[n + 1]之前data [n]已返回。
原因是:
如果我这样做,服务器仍然以随机顺序获取它,并因此以随机顺序将数据保存在我的数据库中。 (或者不是随机的,较重的数据处理较慢)
var promiseArray = [];
for (var i = 0; i < data.length; i++) {
var dataPromise = $http.post('/api/bla/blabla', $httpParamSerializer(data[i]))
.then (function (response) {
//return data for chaining
return response.data;
});
promiseArray.push(dataPromise);
}
$q.all(promiseArray).then(function (dataArray) {
//succes
}).catch (function (errorResponse) {
//error
});
如何确保数据的发送,处理和返回,一次一个地顺利进行?
答案 0 :(得分:3)
你可以这样做:
var i = -1;
processNextdata();
function processNextdata() {
i++;
if(angular.isUndefined(data[i]))
return;
$http.post('/api/bla/blabla', $httpParamSerializer(data[i]))
.then(processNextdata)
}
更新:
每次结果后回调:
var i = -1;
processNextdata();
function processNextdata() {
i++;
if(angular.isUndefined(data[i]))
return;
$http.post('/api/bla/blabla', $httpParamSerializer(data[i]))
.then(function(result) {
// do something with a single result
return processNextdata();
}, errorCallback);
}
一切都完成后回调:
var i = -1, resultData = [];
processNextdata()
.then(function(result) {
console.log(result);
}, errorCallback);
function processNextdata() {
i++;
if(angular.isUndefined(data[i]))
return resultData;
$http.post('/api/bla/blabla', $httpParamSerializer(data[i]))
.then(function(result) {
resultData.push(result.data);
return processNextdata();
}, $q.reject);
}
答案 1 :(得分:0)
使用Promise.all([...])
方法时,文档显示以下内容:
Promise.all(iterable)方法返回一个promise,它在可迭代参数中的所有promise已经解析时解析,或者拒绝第一个传递的拒绝承诺的原因。
这告诉我们的是,没有预期的同步操作顺序,但实际上承诺彼此平行并且可以按任何顺序完成。
在您的情况下, 是您希望承诺投放的预期订单,因此使用Promise.all([...])
无法满足您的要求。
您可以做的是执行单个承诺,然后如果您有一些可以并行运行的承诺使用Promise.all([...])
方法。
我会创建一个方法,将请求作为参数,然后返回生成的promise:
function request (req) {
return new Promise(function (resolve, reject) {
request({
url: url
, port: <port>
, body: req
, json: <true/false>
, method: '<POST/GET>'
, headers: {
}
}, function (error, response, body) {
if (error) {
reject(error);
} else {
resolve(body);
}
});
});
然后您可以调用此函数并存储结果:
var response = request(myRequest);
或者,您可以创建一个请求数组,然后调用函数:
var requests = [request1, request2, ..., requestN];
var responses = [];
for (var i = 0; i < requests.length; i++) {
responses.push(request(requests[i]));
}