Вы не помещаете данные в свой массив, вы вставляете в него объект jQuery jqXHR (который thenable , например, Promise-like) (вот что возвращаемое значение $.getJSON
). Причина того, что результат Promise.all
работает, заключается в том, что Promise.all
ожидает разрешения этих элементов.
Вполне вероятно, что вы вообще не хотите иметь userData
global. Вместо этого, получите любой код, которому нужны данные, получите его из обработчика разрешения на обещание, возвращаемое Promise.all
.
Но если вы действительно хотите заполнить userData
, дождитесь разрешения:
return Promise.all(userApiList.map($.getJSON))
.then(results => {
userData.push(...results);
return results;
});
Обратите внимание, что userData
не будет иметь данных, пока запросы ajax не будут выполнены (конечно).
Вышеуказанное не добавит результаты к userData
, пока они не будут all avaialble. У вас также есть возможность заполнить его по ходу:
return Promise.all(userApiList.map(url => $.getJSON(url).then(result => {
userData.push(result);
return result;
})));
Но важно помнить, что результаты будут добавляться со временем, а не мгновенно, по мере выполнения запросов.
Если вы дождетесь их всех, Promise.all
обеспечит, чтобы они были в том же порядке, что и обещания, которые вы им дадите; если вы добавляете их по ходу, они могут быть не в том порядке (потому что вы нажимаете, когда каждый завершает, а более ранний может завершиться после более позднего).