Я сталкиваюсь с некоторыми трудностями, пытаясь понять, почему $ q.all возвращает ответ последнего обещания в массиве для всех заданных обещаний:

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;
}
0
user3819295 15 Апр 2019 в 12:09

2 ответа

Лучший ответ

Используйте angular.copy, чтобы создать новую копию данных для каждого запроса:

function getPostData(key){
    var req = angular.copy(postRequest);
    req.key = key;
    return req;
}
1
georgeawg 15 Апр 2019 в 09:42

Проблема возникает из-за того, что postRequest является глобальным, следовательно, объект изменяется три раза, но используется один и тот же объект. Либо используйте angular.copy, либо используйте JSON.parse и JSON.stringify, либо просто объявите объект встроенным.

function getPostData(key){
   var postRequest = {
     'endtime' : null,
     'key' : null, 
     'arr' : ['diff','core'],
     'starttime' : null
   };
   postRequest.key = key;
   return postRequest;
}
1
briosheje 15 Апр 2019 в 09:43