javascript api调用,按特定顺序发送和处理数据

时间:2016-04-08 13:50:13

标签: javascript jquery angularjs

我有这个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
});

如何确保数据的发送,处理和返回,一次一个地顺利进行?

2 个答案:

答案 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]));
}