首页 > 解决方案 > 解决多个返回合并数据的 Promise

问题描述

我只是JavaScript Promises的初学者,尽管我在生活中广泛使用了它们,包括 AJAX 请求。

我正在构建一个从 SharePoint 库运行的前端应用程序,它从 SharePoint API 请求用户信息以自定义页面内容。为了获得我想要的所有信息,我需要获取 2 个不同的 URL,因为其中一个不包含我寻找的所有数据。

此外,我正在构建一个库来促进 SharePoint API 的使用,我希望这两个承诺能够在一个单一的承诺中得到解决,结果都已经合并到一个 JSONuserData中。我知道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);
});

标签: javascriptinternet-explorerecmascript-6promiseecmascript-5

解决方案


我得到了它!我理解了 Promise 的工作方式并自己找到了解决方案:我所需要的只是将这些步骤封装到一个新的 Promise 中,并在解决后调用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);
            });
    });
}

推荐阅读