Разрешить несколько обещаний, возвращающих объединенные данные - PullRequest
0 голосов
/ 25 сентября 2019

Я только начинающий с Обещаниями JavaScript , хотя я широко использовал их в своей жизни, с AJAX-запросами.

Я создаю интерфейсное приложение для запуска изБиблиотека SharePoint, и она запрашивает информацию о пользователях из SharePoint API для настройки содержимого страницы.Чтобы получить всю необходимую информацию, мне нужно получить 2 разных URL-адреса, поскольку один не содержит всех данных, которые я ищу.

Кроме того, я создаю библиотеку для облегчения использования SharePoint API и хочуЭти два обещания были решены в одном, а результаты обоих уже объединены в одном JSON userData.Я знаю, Promise.all() делает нечто подобное, однако его результатом является массив с отдельным результатом, который не соответствует второй части, которую я хочу ...

Кроме того, имейте в виду, что я создаю приложение, полностью совместимоев IE многие ресурсы, такие как Asyn / Await, отбрасываются.

Поэтому я хотел, чтобы функция getUser() ниже уже возвращала обещание со свойствами объединенного объекта:

function getUser() {
    var userData1 = axios.get(url + '/web/CurrentUser');
    var userData2 = axios.get(url + '/SP.UserProfiles.PeopleManager/GetMyProperties');

    return Promise.all([userData1, userData2]);
}

var userDataAll;
getUser().then(function(values) {
    userDataAll = Object.assign({}, values[0].data, values[1].data);
});

1 Ответ

0 голосов
/ 25 сентября 2019

Я понял!Я понял, как работают обещания, и сам нашел решение: все, что мне нужно, - это инкапсулировать шаги в новое обещание и вызвать обратный вызов resolve() после того, как Promise.all() будет решен, и объединение закончится с Object.assign():

function getUser() {
    return new Promise(function(resolve, reject) {
        var userData1 = axios.get(url + '/web/CurrentUser');
        var userData2 = axios.get(url + '/SP.UserProfiles.PeopleManager/GetMyProperties');
        Promise
            .all([userData1, userData2])
            .then(function(results) {
                let userData = Object.assign({}, results[0].data, results[1].data);
                resolve(userData);
            })
            .catch(function(errors) {
                reject(errors);
            });
    });
}
...