$ q.all对数组中的所有promise返回相同的响应

时间:2019-04-15 09:09:40

标签: javascript angularjs angular-promise angularjs-http

在尝试理解为什么$ q.all对于给定的所有promise,为什么返回数组中最后一个promise的响应时,我遇到了一些困难。

function getGlobalData() {
    $q.all(
        [
        genericApi.submitPostRequest(getPostData('firstKey')),
        genericApi.submitPostRequest(getPostData('secondKey')),
        genericApi.submitPostRequest(getPostData('specialKey'))
        ])
    .then(function(results){
        vm.globalObject['firstKey'] = results[0].data;
        vm.globalObject['secondKey'] = results[1].data;
        vm.globalObject['specialKey'] = results[2].data;
    });
}

端点都是相同的,我对每个请求所做的唯一更改是“ postData”对象中的一个元素(关键元素)。

function submitPostRequest(data) {    
    return $http({
        method: 'POST',
        data: data,
        url: 'https://someUrl',
        headers: {
            'Content-Type': 'application/json',
            Authorization: 'Bearer someToken'
        }
    });
}

postData:

var postRequest = {
  'endtime' : null,
  'key' : null, 
  'arr' : ['diff','core'],
  'starttime' : null
};

getPostData:

function getPostData(key){
    postRequest.key = key;
    return postRequest;
}

2 个答案:

答案 0 :(得分:1)

使用angular.copy为每个请求制作新的数据副本:

function getPostData(key){
    var req = angular.copy(postRequest);
    req.key = key;
    return req;
}

答案 1 :(得分:1)

之所以发生此问题,是因为postRequest是全局的,因此该对象被更改了3次,但是使用了相同的对象。要么使用angular.copy,要么使用JSON.parseJSON.stringify,要么只是内联声明对象。

function getPostData(key){
   var postRequest = {
     'endtime' : null,
     'key' : null, 
     'arr' : ['diff','core'],
     'starttime' : null
   };
   postRequest.key = key;
   return postRequest;
}